---
# System prepended metadata

title: 新鮮人升級工程師
tags: [Junior]

---

---
tags: Junior
---
# 新鮮人升級工程師

成為優秀軟體開發者的養成之路。
建議你先閱讀過以下文章：

* [每個程式設計師都必讀的12篇文章](https://www.techroomage.com/%E6%AF%8F%E5%80%8B%E7%A8%8B%E5%BC%8F%E8%A8%AD%E8%A8%88%E5%B8%AB%E9%83%BD%E5%BF%85%E8%AE%80%E7%9A%8412%E7%AF%87%E6%96%87%E7%AB%A0/)

> 要真正學好程式設計需要一輩子的時間，持續規劃的學習與練習。
> 
> — Ron Jeffries 等，《極致軟體製程：專案應用》
> 
## 安裝篇
* IDE
    * [JDK DownLoad](http://www.oracle.com/technetwork/java/javase/downloads/index.html)
    * [Spring Tool Suite™](https://spring.io/tools/sts)
    * [Eclipse](http://www.eclipse.org/downloads/eclipse-packages/)
    * [IntelliJ](https://www.jetbrains.com/idea/)
* DataBase
    * [Docker](https://www.docker.com/)
        * [Oracle XE 11g](https://hub.docker.com/r/alexeiled/docker-oracle-xe-11g/)
        * [安裝 Docker for Windows](http://blog.miniasp.com/post/2016/08/01/Docker-for-Windows-1-12-Released.aspx)
    * [Oracle SQL Developer](http://www.oracle.com/technetwork/developer-tools/sql-developer/overview/index.html)
* Revision control
    * [Mysql](https://hub.docker.com/_/mysql)
    * [Subversion(SVN)概念與工具介紹](http://www.cc.ntu.edu.tw/chinese/epaper/0020/20120320_2002.html)
         * [TortoiseSVN](https://tortoisesvn.net/downloads.html)

* [Maven](https://maven.apache.org/)
    * Eclipse 已內建，除非要使用 `mvn` 否則非必要
    * [STS安裝Maven](https://spring.io/blog/2011/10/18/upgrading-maven-integration-for-springsource-tool-suite-2-8-0/)
* [Gradle](https://gradle.org/)
    * Android Studio 以及 STS 已內建，除非要使用 `gradle` 否則非必要
    * [Eclipse安裝Gradle](http://www.vogella.com/tutorials/EclipseGradle/article.html)
* 文字編輯器
    * [VS Code](https://code.visualstudio.com/)
        * 編輯器以上，IDE未滿
        * 開發前端利器!!
    * [Sublime Text](https://www.sublimetext.com/)
    * [Notepad++](https://notepad-plus-plus.org/)
    * [Atom](https://atom.io/)
* [Git](https://git-scm.com/)
    * [Git概念](https://www.slideshare.net/lambmei/git-44632221)
    * [TortoiseGit](https://tortoisegit.org/)
    * [SourceTree](https://www.sourcetreeapp.com/)
    * [30天學會Git](https://github.com/doggy8088/Learn-Git-in-30-days/blob/master/zh-tw/README.md)
* [Cmder](http://cmder.net/)
    * [介紹好用工具：Cmder ( 具有 Linux 溫度的 Windows 命令提示字元工具 )](http://blog.miniasp.com/post/2015/09/27/Useful-tool-Cmder.aspx)
* [m2e](http://www.eclipse.org/m2e/)

## 開發環境設置篇
### 開發使用
* [CheckStyle](http://eclipse-cs.sourceforge.net/#!/)
    * 程式碼風格檢查
* [Sonarlint](https://marketplace.eclipse.org/content/sonarlint)
    * 程式碼風格檢查
* [Subversive - SVN Team Provider](https://marketplace.eclipse.org/content/subversive-svn-team-provider)
    * Eclipse 整合 SVN
    * 安裝好重新啟動時會需要選取 SVN Connectors，選擇 SVN Kit
        * 若無法安裝則手動加入 update site  
          <http://community.polarion.com/projects/subversive/download/eclipse/6.0/update-site/>
* [Properties Editor](https://marketplace.eclipse.org/content/properties-editor)
    * Eclipse Update Sites: <http://propedit.sourceforge.jp/eclipse/updates/>
    * 方便編輯 `.properties` 工具
    * [Eclipse Properties 顯示中文字](https://coffee0127.github.io/blog/2016/08/15/eclipse-poperties/)
* [Lombok](https://projectlombok.org/setup/eclipse)
    * 省去寫 Getter / Setter / equals / ... 等好工具
    * [Lombok 安装、入门 - 消除冗长的 java 代码](http://www.blogjava.net/fancydeepin/archive/2012/07/12/lombok.html)
### 測試使用
* [MoreUnit](http://marketplace.eclipse.org/content/moreunit)
    * 快速建立單元測試程式
    * 測試程式跟實作程式快速切換
* [EclEmma Java Code Coverage](https://marketplace.eclipse.org/content/eclemma-java-code-coverage)
    * 計算程式碼覆蓋率
### 非專案使用 *純粹個人推薦*
* [Emmet](https://emmet.io/)
    * [Sublime text 極速應用教學](https://www.slideshare.net/banPrint/sublime-text-51689543) 第15張投影片開始
    * [Eclipse plugin](https://marketplace.eclipse.org/content/emmet-ex-zen-coding-eclipse-plugin)
        * 不過會跟 `ctrl + D` 快捷鍵衝突，需要修改
    * [Cheat Sheet](http://docs.emmet.io/cheat-sheet/)
* [EasyShell](https://marketplace.eclipse.org/content/easyshell)
* [Run-Jetty-Run](https://marketplace.eclipse.org/content/run-jetty-run)
* [Eclipse Code Recommenders](http://marketplace.eclipse.org/content/eclipse-code-recommenders/)
    * Eclipse 4.3 之後內建

### workspace 設置
* 更改編碼為 UTF-8
    * General > Workspace
        * Text file encoding 改為 Other: UTF-8
* 忽略資源 (避免 commit 不必要檔案至 SVN)
    * Preferences > Team > Ignored Resources
        * add the following patterns:
            ```
            .classpath
            .project
            */.settings
            */target
            */classes
            */.checkstyle
            ```
* 將 Tab 字元改以 4 個空格輸出
    * Preferences > General > Editors > Text Editors
        * Displayed tab width: 改為 4
        * 勾選 `Insert spaces for tabs`
    * Preferences > XML > XML Files > Editor
        * 勾選 `Indent using spaces`
        * Indentation size 改為 4
* Java Coding Style
    * Preferences > Java > Code Style > Formatter
        * Import the [JavaStyle.xml](https://www.dropbox.com/s/hfikamjv1u1xk8f/JavaStyle.xml?dl=0)
    * Preferences > Java > Editor > Save Actions
        * 勾選下列選項
            * Perform the selected actions on save
            * Organize imports
            * Additional actions
        * 點選 Configure
            * Code organizing
                * Remove trailing whitespace & All lines
            * Code Style
                * Use blocks in if/while/for/do statements 及 always
            * Missing Code
                * 全勾
            * Unnecessary Code
                * Remove unused imports
                * Remove unnecessary casts
                * Remove redundant type arguments
* 啟用 Eclipse Check Style
    * 匯入 [CleanCode Checkstyle.xml](https://www.dropbox.com/s/i4ojidehh8n526i/Eclipse%20ccd-checkstyle.xml?dl=0)
        * [使用教學](http://surpendchen.blogspot.tw/2013/04/checkstyle.html)
    * 於專案右鍵 -> Properties -> Checkstyle -> 勾選 Checkstyle active for this project 並確認 Rule 為剛剛匯入的 CleanCode Checkstyle

## 學習篇
### 基礎篇
* [JPA](https://www.tutorialspoint.com/jpa/)
    * [CRUD Operations with JPA](http://www.objectdb.com/java/jpa/persistence/crud)
    * Hint: 可試著將現有 Hibernate 專案改為 JPA 專案
    * [JPA Criteria API Queries](http://www.objectdb.com/java/jpa/query/criteria)
    * Goals
        * JPA 是什麼？跟 Hibernate 的異同？
        * CRUD
        * 各種查詢方法的寫法 (JPQL、NativeSQL、CriteriaQuery)
* [Spring Framework](http://projects.spring.io/spring-framework/)
    * [IoC](https://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans)
        * Goals
            * Spring Bean 的生命週期、Scope
            * 如何建立 Spring Bean (via XML or annotation)
            * Dependency Injection
    * [AOP](https://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#aop)
        * Goals
            * PointCut、Advice、Aspect 等指什麼
            * 如何建立 Aspect / Advisor (via XML or annotation)
    * [SpringData JPA](http://projects.spring.io/spring-data-jpa/)
        * [Spring Boot + Spring Data JPA + Oracle example](https://www.mkyong.com/spring-boot/spring-boot-spring-data-jpa-oracle-example/)
        * [官網範例](https://github.com/spring-projects/spring-data-examples/tree/master/jpa)
            * 查閱 [example](https://github.com/spring-projects/spring-data-examples/tree/master/jpa/example) 及 [query-by-example](https://github.com/spring-projects/spring-data-examples/tree/master/jpa/query-by-example)
        * [Reference](https://docs.spring.io/spring-data/jpa/docs/current/reference/html/)
            * 5.3.1. Query lookup strategies
            * 5.3.2. Query creation
            * 5.3.3. Using JPA NamedQueries
            * 5.3.4. Using @Query
            * 5.3.5. Using Sort
            * 5.3.6. Using named parameters
            * 5.5. Specifications
        * Goals
            * [如何建立 Repository 實體](https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.create-instances)
            * 現有程式碼改用 SpringData 實作
    * [SpringMVC](http://www.mkyong.com/tutorials/spring-mvc-tutorials/) 
    * [Spring Security](https://projects.spring.io/spring-security/) 
    * [Spring Batch + Quartz](https://www.mkyong.com/spring-batch/spring-batch-and-quartz-scheduler-example/)
        * [Spring Batch](http://projects.spring.io/spring-batch/)
        * [Quartz](http://www.quartz-scheduler.org/) 
    * Web Service (JAX-WS)
        * [Building Web Services with JAX-WS](http://docs.oracle.com/javaee/6/tutorial/doc/bnayl.html)
            * 如何使用 `@WebService`、`@WebMethod`、`@WebResult`… 等建立 Web Service Server 端
            * 使用 [wsimport](https://docs.oracle.com/javase/6/docs/technotes/tools/share/wsimport.html) 建立 WebService Client 端
        * SOAP handler (Web Service 的 filter)
            * [JAX-WS : SOAP handler in server side](http://www.mkyong.com/webservices/jax-ws/jax-ws-soap-handler-in-server-side/)
            * [@HandlerChain](http://tomee.apache.org/examples-trunk/webservice-handlerchain/)
        * [使用 Apache CXF、Spring 整合 JAX-WS](http://cxf.apache.org/docs/springboot.html)
            * [Configuring an Endpoint](http://cxf.apache.org/docs/jax-ws-configuration.html)
        * Goals
            * [SOA是什麼](http://www.cc.ntu.edu.tw/chinese/epaper/20070620_1008.htm)
            * [什麼是 Web Service](http://www.dsc.com.tw/newspaper/46/46-1.htm)
            * SOAP、WSDL是什麼

### 進階篇
* [POM Relationships](https://maven.apache.org/pom.html#POM_Relationships)
    * Goals
        * 如何加入 `dependency`
        * `groupId`, `artifactId`, `version` 用途
* [Dependency Mechanism](https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html)
    * Goals
        * 各 `scope` 之間差異為何
        * `dependencies` vs `dependencyManagement`
* OS
    * Windows 
    * [Linux](http://linux.vbird.org/)
        * CentOS
        * Ubuntu

### 如果還有時間
* 資料結構
* 演算法
* 計算機組織
* 設計模式

> 要真正變成資深工程師，你除了持續規劃的學習與練習。
> 
> 還必須懂得思考，工具、框架到底是甚麼？怎麼運作。
> 
> 不要變成只會使用工具和框架的’工具人’

### 未來能如何走
* 第一條路線：JS（前端）
你已經有良好的OOP基礎,轉職到JS領域不會太難,主流的React,Angular,Vue + nodejs 這些可以快速上手
PS 只是JS的概念都是函數編程,需要多加學習
* 第二條路線：Python
Java轉Python幾乎可以說無痛,後面呢AI,BigData,ML任君挑選,
PS 但是如果想走好ML這領域,數學不可少喔
* 第三條路線：Go
這個就比較有挑戰性,不過可以應用的地方也很多,影音串流,微服務,還有許多可以挖掘的領域
* 第四條路線：CloudNative
SpringCloud,可以說是Java唯一僅存的一個大領域,依靠大樹,往CloudNative發展,微服務結合DevOps


## 附件
* [Yahei Consolas Hybrid 中英等寬字體](https://www.dropbox.com/s/co44hfvv16ww7je/Yahei.Consolas.1.13.ttf?dl=0)
* [Eclipse 快捷鍵](https://www.dropbox.com/s/mgnxudcpnle38m5/Eclipse%E5%BF%AB%E6%8D%B7%E9%8D%B5.txt?dl=0)
* [Java 命名慣例](https://www.dropbox.com/s/gavpdfn049tnbpf/%E5%91%BD%E5%90%8D%E6%85%A3%E4%BE%8B.txt?dl=0)