why you write code so slow.

今天咱們要寫一個日曆表,用以存儲全部的節假日。java

雖然這個表設計的並非很妙。可是將就着繼續了。程序員

讓小弟把該表數據初始化3-5年的,結果一上午尚未出來,着急了,本身寫了一個初始化的工具。編程

分享出來。app

 

 1 import java.util.Calendar;
 2 
 3 
 4 public class CalendarApp {
 5 
 6     
 7     String [] holidays = new String[]{"2013-10-01","2013-10-02","2013-10-03","2013-10-04", "2014-10-01","2014-10-02","2014-10-03","2014-10-04"};
 8     String [] workdays = new String[]{"2013-09-30"};
 9     
10     public boolean isHoliday(int year, int month, int day) {
11         String date = padding(year,4) +"-"+ padding((month+1), 2) +"-" + padding(day, 2);
12         for (String d : holidays) {
13             if(d.equals(date)) {
14                 return true;
15             }
16         }
17         return false;    
18     }
19 
20     private String padding(int number, int length) {
21         String text = String.valueOf(number);
22         for (int i = length ;  i > text.length(); i--) {
23             text = "0" + text;
24         }
25         return text;
26     }
27 
28     public boolean isWorkDay(int year, int month, int day) {
29         String date = padding(year,4) +"-"+ padding((month+1), 2) +"-" + padding(day, 2);
30         for (String d : workdays) {
31             if(d.equals(date)) {
32                 return true;
33             }
34         }
35         return false;    
36     }
37     
38     public boolean isWeekend(int year, int month, int day) {
39         Calendar cal = Calendar.getInstance();
40         cal.set(Calendar.YEAR, year);
41         cal.set(Calendar.MONTH, month);
42         cal.set(Calendar.DATE, day);
43         int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
44         return dayOfWeek > 4;    
45     }
46 
47     private boolean isDate(int year, int month, int day) {
48         Calendar cal =  Calendar.getInstance();
49         cal.set(Calendar.YEAR, year);
50         cal.set(Calendar.MONTH, month);
51         cal.set(Calendar.DATE, day);
52         int y = cal.get(Calendar.YEAR);
53         int m = cal.get(Calendar.MONTH);
54         int d = cal.get(Calendar.DATE);
55         return year == y && month == m && day == d;
56     }
57     
58     public boolean calc(int year, int month, int day) {
59         String date = padding(year,4) +"-"+ padding((month+1), 2) +"-" + padding(day, 2);
60         System.out.println(date);
61         if(isWeekend(year, month, day) ){
62             if(isWorkDay(year, month, day)){
63                 return false;
64             }
65             return true;
66         } else {
67             if(isHoliday(year, month, day) ){
68                 return true;
69             }
70             return false;
71         }
72     }
73     
74     public static void main(String[] args) {
75         CalendarApp app = new CalendarApp();
76         for (int year = 2013; year < 2016; year ++) {
77             for (int month = 9;month<10;month++) {
78                 for (int day=1; day<32;day++) {
79                     if (app.isDate(year,month, day)) {
80                         boolean vacation = app.calc(year, month, day);
81                         CompanyCalendar comCal = new CompanyCalendar(year, month, day, vacation);
82                         comCal.save();
83                     }
84                 }
85             }
86         }
87     }
88 }


 這段代碼大概用了20分鐘寫完的。工具

可是好幾我的在寫這個功能的時候用的時間都要遠遠長於這個時間。測試

那麼咱們就來分析一下爲何你們寫代碼會慢。網站

 

1. 整理思路搜索引擎

    有這樣一種工做方式:在寫代碼以前先要整理思路,在紙上描來畫去,當思路清晰以後纔開始寫代碼。編碼

    這個思考的過程佔去了一部分時間。spa

   (難道這個時間能夠節省嗎?慢慢來,往下看。)

2. 敲擊鍵盤的方法

   不熟悉鍵盤,不熟悉IDE,都是效率的殺手。寫的時候還要本身輸入Tab或者空格來對齊。

   這些都會形成時間的浪費。

  (這也太狗血了吧。不過的確很現實)

3. 不熟悉API

   因爲對於API的熟悉程度不夠,有些東西要從新發明輪子,有些東西要繞彎路,這些也是時間浪費的元兇之一。

   (這個的確是,可是這個得靠經驗吧。嗯,差很少是這樣,可是能夠問啊。)

   時間飛逝。

4. 方法老是在變

   思路不固定,寫的時候發現,這兒很差,那兒不行,這裏要改進,那裏要完善,因而,在反反覆覆中度過了不少時間。

   (那發現錯了還不改嗎?得改,可是別改來改去又改回來,猶豫是大敵)

   猶豫來猶豫去,時間就沒了。

5. 尋找捷徑

    有些時候回想,會不會有捷徑可以完成這個任務呢,也許真的有,可是若是知道有,立刻能夠用那就用。

   若是不知道,或者須要查好久,那麼何不先直接寫下來一個比較笨的,而後再改進呢?

    尋找捷徑的時間比正常笨辦法走過去的時間還要長。

6. 不會用搜索引擎

   (別搞笑了,寫代碼,和搜索引擎有什麼關係?)

    哇哦,那你不會的時候怎麼辦?是否是要搜索。(哦)

    但是你輸入的是什麼關鍵詞?你獲得的答案有多少是可用的,又有多少頁面給出了答案了呢?

   寶貴的時間就在低效的搜索中度過了。

7. 不會Debug

    不會Debug,斷點設置了一大堆,可是沒有幾個是有用的,結果每次執行都要被打斷,打斷再打斷。

    還不如插個Log快呢。

    時間就這麼滑過去了。

8. 不會用測試

    不會測試,採用System.out.println而後肉眼觀察。

    其實,JUnit一個TestCase可能就搞定了。

    並且在跟蹤的時候不會用Log,輸出的內容老是不在點上。

    不少時間就不過去了。

 

寶貴的時間就這麼流逝了。

 

這就是你寫代碼變慢的幾個常見的緣由。

那麼怎麼解決呢? 好的,咱們來看看怎麼纔可以加快寫代碼的速度。

 

1. 去掉紙上設計

   紙上設計的最大問題在於,你沒辦法校驗設計的正確性。即便UML工具也沒辦法告訴你可能出現編譯錯誤、邏輯錯誤。

   那怎麼辦?答案就是去掉紙上設計。難道一點設計都沒有寫代碼可以可靠嗎?

   那若是你聽過極限編程(XP)那你就必定會知道,有那麼一小撮人,寫代碼真的沒有設計。

   沒有設計聽起來天方夜譚。實際上並非沒有設計,而是進行最簡單的設計,簡單的模型,就開始編碼,讓IDE告訴程序員,

   哪一個地方編譯不經過,哪一個地方邏輯複雜度偏高,哪裏會出現重複...

   而後利用重構工具,將這些代碼一一改過來。

   逐步的就造成了正確的設計,這就是演進式設計。因爲直接寫的是能夠工做的代碼,因此,節省了大量的時間。

2. 熟記快捷鍵,利用IDE特性

   IDE會幫助你格式化代碼,無需一個個的Tab去敲。

   IDE會幫助你重構,而無需用檢索 -> 替換,那有可能讓你替換了不應替換的代碼。

   IDE會幫你快速定位代碼,而不須要連續按動上下箭頭,或者是拉動滾動條。

   .一下就會告訴你這個對象能夠有哪些變量供訪問,哪些方法供調用。

3. 熟記經常使用API

    經常使用的API須要熟記,這樣纔可以信手拈來。

    好比,如何從一堆數據中過濾出來符合條件的數據,多是採用lambda表達式最好。

    若是沒法用lambda表達式,那麼試試CollectionUtils。

    從新發明輪子可能不只僅是形成時間浪費,有時候還會引入Bug。 

4. 學會用搜索引擎

    當你想要尋找捷徑的時候,問問搜索引擎。

    固然你得學會如何利用關鍵詞提升搜索出答案的機率。你也得了解哪些網站會給你正確的答案,而哪些網站,問了也不會有下文。

    最好的搜索引擎恐怕就是你的QQ羣,微博上關注的某幾個高手。可是高手未必有時間來回答你的問題,因此你可能會感到很差意思。

    那麼,一次生兩次熟,問問高手如何思考,如何搜索,你就會逐步的學會。

    不恥下問,上問也沒必要羞。

5. 改變思路,另闢蹊徑

    也許一個Java問題困惑了你很長時間,可是SQL可能立刻就能夠解決。

    也許一個List須要很長的循環才能搞定的事情,Map只須要3-5行。

 

6. 中止Debug

   我不多見到人用Debug工具很高效的。採用Debug Log,它不會讓你的程序斷,也不會讓你在大腦裏記憶不少東西。

   它很連貫,可是要善於寫Log。

7. Test Automation

   毋庸置疑,若是寫完了代碼有一個事物會告訴你正確了——那它必定是自動測試工具。

   寫測試吧。磨刀不誤砍柴工。

相關文章
相關標籤/搜索