Ⅰ 孩子學編程有什麼好吃少兒編程/scratch
童程少兒編程名師解答: 學習編程最核心目的是通過「訓練人的思維方式,培養新的看待問題和處理問題的方式」 ①提高數學思維,和邏輯思維能力(讓孩子變的更聰明): 編程是強度最大的腦力勞動,軟體學科中的一切並非自然生成,完全出自人的大腦的抽象、設計和歸納。解一道數學題的方法就是2-3中,不會超過5種,單只編程有千萬種,編程活動對於培養人的數學思維、邏輯思維、抽象思維有著莫大的好處。 ②養成嚴謹的習慣: 編程語言是最精密的語言。一個分號的缺失導致程序完全不能運行,兩條語句順序的顛倒會使結果大相徑庭。對於程序員的訓練,首先就是要去除「馬虎」的因素,講嚴謹的工作習慣植入內心。 ③提高解決問題分析問題的能力: 程序不是寫一次就能正確的,不是寫十次就能達到你所期望的結果,一個好的程序要調試十次甚至上百次,比如一個ATM取款機一個正常程序可能只需要100行,但是它要考慮到一些異常情況的發生,大概是正常程序的5-10次。 ④讓孩子有成就感: 孩子通過一串串代碼的編寫,完成曾經自己和夥伴未能通關的游戲,編寫一個個完整的游戲項目非常能建立孩子們的成就感。 ⑤完成項目 軟體不是簡單代碼的堆砌,而是架構的藝術;代碼分裝成類,類組成模塊,模塊構建子系統,子系統相互協同實現完整的系統功能。系統設計、整體規劃、團隊合作,這些都程序員標志性技能。 編程團隊分工的耦合度很高,所以編程是能夠提高孩子團隊合作的能力。
Ⅱ 現實中程序員是怎樣飛快敲代碼的
敲代碼很快有幾個條件
1.對項目代碼和結構非常熟悉,知道整個數據流的在代碼中的流動過程和變化過程。知道當前新增的代碼在整個項目處於哪個位置,對於數據會有產生什麼新的變化。這些要心理有數。也就是從架構層面去思考代碼的編寫。
2.對於需求理解的很透。這樣業務邏輯轉成代碼邏輯就不會有任何不清楚的地方。
3.已經解決了技術難點,也就是說前期測試性代碼已經寫過了弄清楚了,避免了突然出現的技術性難點
4.新增的代碼和新增的數據結構已經仔細思考過了,並設計好。也清楚引入這些新的代碼和數據結構對現有代碼的整體影響
5.異常點的位置的處理方案已經安排好了。寫代碼一部分是正常業務流程,演算法過程,但是另外一大塊就是處理各種異常。當異常出現之後,是代碼重試,報錯後忽略,還是報錯之後停止代碼,還是報錯後清理代碼並重新恢復上一個狀態,等等。這些都是要心理有數。
6.對於如何新增源代碼文件,命名函數,命名文件名,命名類名,命名變數名有一整套方案。有時候想個函數名或者變數名都要卡好幾分鍾,就不算飛快了。別笑,想個變數名,網路十來分鍾的時候多了去了。
7.外部環境已經准備好了。IDE穩定,資料庫結構穩定,數據穩定,網路穩定,訪問網頁順暢,准備好免打擾的牌子。准備好刷卡提需求的二維碼,准備好板磚和大刀,預防產品經理提需求和改需求。
Ⅲ 急急急!!! 知道快進!!!
數是除2取余倒計法,小數是乘2取整正計法。負數和正數一樣,只是最後加個負號就行了。舉幾個例子
首先八進制Octal:
八進制Octal是以8為基的。因為8 == 2^3, 所以每個八進制數字代表3個二進制數字(或位)
如:123(octal) = 001 010 011
十進制如下:41(decimal) = 0010 1001 = 00 101 001 = 051 (octal)
注意:分組是從最右邊開始的(41 不能如下分組"001 010 01")
十六進制:
十六進制Hex是以16為基的。因為16 == 2^4, 所以每個八進制數字代表4個二進制數字(或位)
單個十六進制數字的范圍是0000 - 1111 (即 0-15 (十進制decimal)), 但是這樣的話數字不夠了,因此十進制10-15 (1010-1111)用字母A-F (大小寫無所謂)代表.
例如:
123(hex) = 0001 0010 0011
1ac(hex) = 0001 1010 1100
用十進制一樣:41(十進制) = 0010 1001 = 29 (十六進制hex)
8(進制)轉換成2(進制)-----把每一位數轉化為三位數,
16((進制)轉換成2(進制)---把每一位數轉化為四位數,
8(進制)轉換成16(進制)----先轉化為2進制,再轉化,...
16(進制)轉換成8(進制)----先轉化為2進制,再轉化,...
回答者:獨立寒冬 - 高級經理 六級 4-20 16:02
windows附件里自帶有計算器,選擇為科學型很容易就實現進制轉換!
電腦上的常用進制有:2、8、10、16四種,在修改中經常接觸的是2、10和16進制,基本上需要了解的是2和16互轉、10和16互轉,其他多了解也沒虧
2轉16:
4個2進制位為一個16進制數,2進制1111為16進制F,2進制中千位的1=8,百位的1=4,十位的1=2,個位的1=1,將各個位的數作相應轉換再相加,的到的數就是10進制數0-15,可輕松轉換成16進制。如01011100,可看成是兩組2進制數0101和1100,則這個數就是16進制的5C。
10轉16:
100以內一點的10轉16心算比較快,復雜的用「計算器」算了。10轉16用傳統的計算方式可以了,就是大於15小於256的10進制數除以16為的值為十位的16進制數,其餘數為個位的16進制數,沒余數則個位為0。如61的16進制是3D,61除以16得3餘13,3作十位數,13轉成D為各位數。
16轉10:
用相反的道理,將十位數乘以16加上個位數。如5A,將5乘以16得80,加上A的10進制10,結果是90。
最直接方便的方法是用windows或win95中的計算器,打開計算器,將計算器置成科學型(win95的乘法),選中十進制選擇鈕,輸入十進制數然後選擇二進制選擇鈕,OK!又快又准確。可是如果你想成為一個合格的程序員的話,你就必須充分了解十進制數和二進制數的特點,最好的方法是你多做一些進制轉換的題目,這是程序員訓練中的傳統做法。
三、以十六進製作橋梁
十進制到二進制的轉換實在麻煩,而且二進制數實在不易記憶和理解,你能馬上感覺到一萬元是多少錢,但是你能感覺到10011100010000(二進制)是多少嗎?為了編程和使用方便,在二進制和十進制之間有了一座橋梁十六進制。十六進制是逢十六進一,0、1、2、3、4、5、…9、A、B、C、D、E、F、10、11、12……。到了9以後用ABCDEF表示,十六進制數與二進制數的轉換非常方便。
首先你應當牢記下表
二進制 十六進制
0 0
1 1
10 2
11 3
100 4
101 5
110 6
111 7
1000 8
1001 9
1010 A
1011 B
1100 C
1101 D
1110 E
1111 F
二進制數轉換成十六進制數方法如下,以二進制數1101110為例:
將二進制數從右面開始以四位為一組分組,最左面不夠四位的補0,按上表查得對應的十六進制數,組合起來以後就成了。
0110 1110的十六進制數是6E
十六進制轉換成二進制方法如下,以十六進制數3E為例:
將十六進制的每一位轉換成四位二進制數,不足四位的在左面補0,組合起來即可得到二進制數。
3E的二進制數是00111110,既是111110
當然你也可以用計算器得出結果。但也建議你熟練掌握。
也許熱愛改游戲的你已經猜到,這就是你在改游戲的時候為什麼總是與2A、3B、4C、5D、EF等奇怪數字打交道的原因了。它們表示的十六進制數。
怎麼樣夠煩人的吧?我也曾經這樣認為,為了進一步更好更快地掌握學習游戲編程,你必須了解這些進制轉換。
數是除2取余倒計法,小數是乘2取整正計法。負數和正數一樣,只是最後加個負號就行了。舉幾個例子
首先八進制Octal:
八進制Octal是以8為基的。因為8 == 2^3, 所以每個八進制數字代表3個二進制數字(或位)
如:123(octal) = 001 010 011
十進制如下:41(decimal) = 0010 1001 = 00 101 001 = 051 (octal)
注意:分組是從最右邊開始的(41 不能如下分組"001 010 01")
十六進制:
十六進制Hex是以16為基的。因為16 == 2^4, 所以每個八進制數字代表4個二進制數字(或位)
單個十六進制數字的范圍是0000 - 1111 (即 0-15 (十進制decimal)), 但是這樣的話數字不夠了,因此十進制10-15 (1010-1111)用字母A-F (大小寫無所謂)代表.
例如:
123(hex) = 0001 0010 0011
1ac(hex) = 0001 1010 1100
用十進制一樣:41(十進制) = 0010 1001 = 29 (十六進制hex)
8(進制)轉換成2(進制)-----把每一位數轉化為三位數,
16((進制)轉換成2(進制)---把每一位數轉化為四位數,
8(進制)轉換成16(進制)----先轉化為2進制,再轉化,...
16(進制)轉換成8(進制)----先轉化為2進制,再轉化,...
回答者:獨立寒冬 - 高級經理 六級 4-20 16:02
windows附件里自帶有計算器,選擇為科學型很容易就實現進制轉換!
電腦上的常用進制有:2、8、10、16四種,在修改中經常接觸的是2、10和16進制,基本上需要了解的是2和16互轉、10和16互轉,其他多了解也沒虧
2轉16:
4個2進制位為一個16進制數,2進制1111為16進制F,2進制中千位的1=8,百位的1=4,十位的1=2,個位的1=1,將各個位的數作相應轉換再相加,的到的數就是10進制數0-15,可輕松轉換成16進制。如01011100,可看成是兩組2進制數0101和1100,則這個數就是16進制的5C。
10轉16:
100以內一點的10轉16心算比較快,復雜的用「計算器」算了。10轉16用傳統的計算方式可以了,就是大於15小於256的10進制數除以16為的值為十位的16進制數,其餘數為個位的16進制數,沒余數則個位為0。如61的16進制是3D,61除以16得3餘13,3作十位數,13轉成D為各位數。
16轉10:
用相反的道理,將十位數乘以16加上個位數。如5A,將5乘以16得80,加上A的10進制10,結果是90。
最直接方便的方法是用windows或win95中的計算器,打開計算器,將計算器置成科學型(win95的乘法),選中十進制選擇鈕,輸入十進制數然後選擇二進制選擇鈕,OK!又快又准確。可是如果你想成為一個合格的程序員的話,你就必須充分了解十進制數和二進制數的特點,最好的方法是你多做一些進制轉換的題目,這是程序員訓練中的傳統做法。
三、以十六進製作橋梁
十進制到二進制的轉換實在麻煩,而且二進制數實在不易記憶和理解,你能馬上感覺到一萬元是多少錢,但是你能感覺到10011100010000(二進制)是多少嗎?為了編程和使用方便,在二進制和十進制之間有了一座橋梁十六進制。十六進制是逢十六進一,0、1、2、3、4、5、…9、A、B、C、D、E、F、10、11、12……。到了9以後用ABCDEF表示,十六進制數與二進制數的轉換非常方便。
首先你應當牢記下表
二進制 十六進制
0 0
1 1
10 2
11 3
100 4
101 5
110 6
111 7
1000 8
1001 9
1010 A
1011 B
1100 C
1101 D
1110 E
1111 F
二進制數轉換成十六進制數方法如下,以二進制數1101110為例:
將二進制數從右面開始以四位為一組分組,最左面不夠四位的補0,按上表查得對應的十六進制數,組合起來以後就成了。
0110 1110的十六進制數是6E
十六進制轉換成二進制方法如下,以十六進制數3E為例:
將十六進制的每一位轉換成四位二進制數,不足四位的在左面補0,組合起來即可得到二進制數。
3E的二進制數是00111110,既是111110
當然你也可以用計算器得出結果。但也建議你熟練掌握。
也許熱愛改游戲的你已經猜到,這就是你在改游戲的時候為什麼總是與2A、3B、4C、5D、EF等奇怪數字打交道的原因了。它們表示的十六進制數。
怎麼樣夠煩人的吧?我也曾經這樣認為,為了進一步更好更快地掌握學習游戲編程,你必須了解這些進制轉換。
數是除2取余倒計法,小數是乘2取整正計法。負數和正數一樣,只是最後加個負號就行了。舉幾個例子
首先八進制Octal:
八進制Octal是以8為基的。因為8 == 2^3, 所以每個八進制數字代表3個二進制數字(或位)
如:123(octal) = 001 010 011
十進制如下:41(decimal) = 0010 1001 = 00 101 001 = 051 (octal)
注意:分組是從最右邊開始的(41 不能如下分組"001 010 01")
十六進制:
十六進制Hex是以16為基的。因為16 == 2^4, 所以每個八進制數字代表4個二進制數字(或位)
單個十六進制數字的范圍是0000 - 1111 (即 0-15 (十進制decimal)), 但是這樣的話數字不夠了,因此十進制10-15 (1010-1111)用字母A-F (大小寫無所謂)代表.
例如:
123(hex) = 0001 0010 0011
1ac(hex) = 0001 1010 1100
用十進制一樣:41(十進制) = 0010 1001 = 29 (十六進制hex)
8(進制)轉換成2(進制)-----把每一位數轉化為三位數,
16((進制)轉換成2(進制)---把每一位數轉化為四位數,
8(進制)轉換成16(進制)----先轉化為2進制,再轉化,...
16(進制)轉換成8(進制)----先轉化為2進制,再轉化,...
回答者:獨立寒冬 - 高級經理 六級 4-20 16:02
windows附件里自帶有計算器,選擇為科學型很容易就實現進制轉換!
電腦上的常用進制有:2、8、10、16四種,在修改中經常接觸的是2、10和16進制,基本上需要了解的是2和16互轉、10和16互轉,其他多了解也沒虧
2轉16:
4個2進制位為一個16進制數,2進制1111為16進制F,2進制中千位的1=8,百位的1=4,十位的1=2,個位的1=1,將各個位的數作相應轉換再相加,的到的數就是10進制數0-15,可輕松轉換成16進制。如01011100,可看成是兩組2進制數0101和1100,則這個數就是16進制的5C。
10轉16:
100以內一點的10轉16心算比較快,復雜的用「計算器」算了。10轉16用傳統的計算方式可以了,就是大於15小於256的10進制數除以16為的值為十位的16進制數,其餘數為個位的16進制數,沒余數則個位為0。如61的16進制是3D,61除以16得3餘13,3作十位數,13轉成D為各位數。
16轉10:
用相反的道理,將十位數乘以16加上個位數。如5A,將5乘以16得80,加上A的10進制10,結果是90。
最直接方便的方法是用windows或win95中的計算器,打開計算器,將計算器置成科學型(win95的乘法),選中十進制選擇鈕,輸入十進制數然後選擇二進制選擇鈕,OK!又快又准確。可是如果你想成為一個合格的程序員的話,你就必須充分了解十進制數和二進制數的特點,最好的方法是你多做一些進制轉換的題目,這是程序員訓練中的傳統做法。
三、以十六進製作橋梁
十進制到二進制的轉換實在麻煩,而且二進制數實在不易記憶和理解,你能馬上感覺到一萬元是多少錢,但是你能感覺到10011100010000(二進制)是多少嗎?為了編程和使用方便,在二進制和十進制之間有了一座橋梁十六進制。十六進制是逢十六進一,0、1、2、3、4、5、…9、A、B、C、D、E、F、10、11、12……。到了9以後用ABCDEF表示,十六進制數與二進制數的轉換非常方便。
首先你應當牢記下表
二進制 十六進制
0 0
1 1
10 2
11 3
100 4
101 5
110 6
111 7
1000 8
1001 9
1010 A
1011 B
1100 C
1101 D
1110 E
1111 F
二進制數轉換成十六進制數方法如下,以二進制數1101110為例:
將二進制數從右面開始以四位為一組分組,最左面不夠四位的補0,按上表查得對應的十六進制數,組合起來以後就成了。
0110 1110的十六進制數是6E
十六進制轉換成二進制方法如下,以十六進制數3E為例:
將十六進制的每一位轉換成四位二進制數,不足四位的在左面補0,組合起來即可得到二進制數。
3E的二進制數是00111110,既是111110
當然你也可以用計算器得出結果。但也建議你熟練掌握。
也許熱愛改游戲的你已經猜到,這就是你在改游戲的時候為什麼總是與2A、3B、4C、5D、EF等奇怪數字打交道的原因了。它們表示的十六進制數。
怎麼樣夠煩人的吧?我也曾經這樣認為,為了進一步更好更快地掌握學習游戲編程,你必須了解這些進制轉換。
數是除2取余倒計法,小數是乘2取整正計法。負數和正數一樣,只是最後加個負號就行了。舉幾個例子
首先八進制Octal:
八進制Octal是以8為基的。因為8 == 2^3, 所以每個八進制數字代表3個二進制數字(或位)
如:123(octal) = 001 010 011
十進制如下:41(decimal) = 0010 1001 = 00 101 001 = 051 (octal)
注意:分組是從最右邊開始的(41 不能如下分組"001 010 01")
十六進制:
十六進制Hex是以16為基的。因為16 == 2^4, 所以每個八進制數字代表4個二進制數字(或位)
單個十六進制數字的范圍是0000 - 1111 (即 0-15 (十進制decimal)), 但是這樣的話數字不夠了,因此十進制10-15 (1010-1111)用字母A-F (大小寫無所謂)代表.
例如:
123(hex) = 0001 0010 0011
1ac(hex) = 0001 1010 1100
用十進制一樣:41(十進制) = 0010 1001 = 29 (十六進制hex)
8(進制)轉換成2(進制)-----把每一位數轉化為三位數,
16((進制)轉換成2(進制)---把每一位數轉化為四位數,
8(進制)轉換成16(進制)----先轉化為2進制,再轉化,...
16(進制)轉換成8(進制)----先轉化為2進制,再轉化,...
回答者:獨立寒冬 - 高級經理 六級 4-20 16:02
windows附件里自帶有計算器,選擇為科學型很容易就實現進制轉換!
電腦上的常用進制有:2、8、10、16四種,在修改中經常接觸的是2、10和16進制,基本上需要了解的是2和16互轉、10和16互轉,其他多了解也沒虧
2轉16:
4個2進制位為一個16進制數,2進制1111為16進制F,2進制中千位的1=8,百位的1=4,十位的1=2,個位的1=1,將各個位的數作相應轉換再相加,的到的數就是10進制數0-15,可輕松轉換成16進制。如01011100,可看成是兩組2進制數0101和1100,則這個數就是16進制的5C。
10轉16:
100以內一點的10轉16心算比較快,復雜的用「計算器」算了。10轉16用傳統的計算方式可以了,就是大於15小於256的10進制數除以16為的值為十位的16進制數,其餘數為個位的16進制數,沒余數則個位為0。如61的16進制是3D,61除以16得3餘13,3作十位數,13轉成D為各位數。
16轉10:
用相反的道理,將十位數乘以16加上個位數。如5A,將5乘以16得80,加上A的10進制10,結果是90。
最直接方便的方法是用windows或win95中的計算器,打開計算器,將計算器置成科學型(win95的乘法),選中十進制選擇鈕,輸入十進制數然後選擇二進制選擇鈕,OK!又快又准確。可是如果你想成為一個合格的程序員的話,你就必須充分了解十進制數和二進制數的特點,最好的方法是你多做一些進制轉換的題目,這是程序員訓練中的傳統做法。
三、以十六進製作橋梁
十進制到二進制的轉換實在麻煩,而且二進制數實在不易記憶和理解,你能馬上感覺到一萬元是多少錢,但是你能感覺到10011100010000(二進制)是多少嗎?為了編程和使用方便,在二進制和十進制之間有了一座橋梁十六進制。十六進制是逢十六進一,0、1、2、3、4、5、…9、A、B、C、D、E、F、10、11、12……。到了9以後用ABCDEF表示,十六進制數與二進制數的轉換非常方便。
首先你應當牢記下表
二進制 十六進制
0 0
1 1
10 2
11 3
100 4
101 5
110 6
111 7
1000 8
1001 9
1010 A
1011 B
1100 C
1101 D
1110 E
1111 F
二進制數轉換成十六進制數方法如下,以二進制數1101110為例:
將二進制數從右面開始以四位為一組分組,最左面不夠四位的補0,按上表查得對應的十六進制數,組合起來以後就成了。
0110 1110的十六進制數是6E
十六進制轉換成二進制方法如下,以十六進制數3E為例:
將十六進制的每一位轉換成四位二進制數,不足四位的在左面補0,組合起來即可得到二進制數。
3E的二進制數是00111110,既是111110
當然你也可以用計算器得出結果。但也建議你熟練掌握。
也許熱愛改游戲的你已經猜到,這就是你在改游戲的時候為什麼總是與2A、3B、4C、5D、EF等奇怪數字打交道的原因了。它們表示的十六進制數。
怎麼樣夠煩人的吧?我也曾經這樣認為,為了進一步更好更快地掌握學習游戲編程,你必須了解這些進制轉換。
Ⅳ java程序員如何提升自己
當前最多的程序員可能就是Java程序員了,作為工作了近20年的Java程序員,一路走來經歷過很多彎路,也見過、培訓過很多技術人員一步步成長,作為公司的技術負責人一直試圖把自己血淚史、最佳實踐進行傳導、傳播,中間犯過理想主義的錯誤,以為:告訴他(們),他們就可以知道、就會不犯錯誤,事實上不是這樣的,計算機是一門實踐性科學,很多東西需要實踐、反復訓練才可以深刻理解、才可以轉化為能力,以至變成下意識的行為。
有人天生代碼感覺、邏輯思維比較好,有些人後天訓練、打開天眼也可以成為技術高手,多看、多研究、多實踐、多總結是笨招也是必殺。另外,溝通交流是可以讓你進步加速的,不要悶頭苦學,在前5年工作生涯里做的絕大多數的事情,都是把前人的知識進早胡鋒行收集應用、歸納總結,要知道哪些不知道、要知道哪些東西自己必須要知道,對不知道的領域結合自己工作情況制定計劃,逐步落實、修煉內功。
對於程序員來說,如果可能盡量選一個技術型公司、最好有「傳幫帶」文化體系的公司,要學會制定計劃、落實計劃、工作總結、溝通交流,習慣看源碼、習慣調試、習慣反編譯、習慣問別人之前先把問題說清楚了、習慣寫需求/設計/測試文檔、習慣了解新生技術以及思考為什麼產生、底層原理以及如何跟自己當前工作結合。要學會喜歡跟不同領域的人員溝通,底層邏輯相通的,成為高手過程中經歷是相似的、可以借鑒的。
成為高手最重要的是:對未知領域的求陸晌做搏知欲、傻逼一樣的持續堅持以及過程中的不斷優化改進的工作學習方法。學而優則仕,當積累到一定程度的時候,你可以選擇華麗轉型,也可以選擇升級打怪,也可以自主創業打造平台,不管怎樣:勤奮、堅持、改進,Thereisnosetpath,Justfollowyourheart!
數通暢聯專注於企業IT架構、SOA綜合集成、數據治理分析領域,感謝您的閱讀與關注。
Ⅳ 如何提升程序員的代碼編寫能力
一、先列三個常見的開發場景:
1、拿到一個模塊詳細設計文檔,大部分程序員的通常做法就是開始搭建界面代碼,然後從第一個按鈕點擊事件或頁面Load事件開始寫第一行業務代碼。寫的差不多了,就運行一下,發現哪裡不是自己想的那樣,就改改,直到改到是自己預想的那樣。
2、做完了一個功能模塊或幾塊相關聯的功能模塊,輸入111asd,發現新建正常、保存正常,就提交給測試人員。測試員用測試用數據、測試場景用例來測試,發現有問題,就登記bug。對於嚴重的影響下一步測試的BUG,測試員就用內部IM通知這個開發人員。對於不影響繼續往下測試的BUG,測試員就登記下來,等程序員有空時處理。
3、程序員一般工作不希望大家打擾,所以開發起來就是開發。等手頭開發告一段落,就看看BUG庫。發現有與自己有關的BUG,就從第一個BUG開始看起。就開始通過IM和測試員掰扯起來(這不是個BUG啊、業務邏輯不是你想的那樣啊、我這里不能重現啊、你給的信息描述不清晰啊),於是IM幾來幾往,甚至跑過去當面交流一番,甚至會拉扯上產品經理一起討論,更甚者需要項目經理或產品經理發起一個會議來集體討論一下
這是不是很熟悉呢?這就是大部分程序員開發的三個步驟:寫代碼、自測、修復BUG。
二、說好的代碼設計、代碼測試呢?
代碼設計?那不是都有開發平台么,已經固化了啊。那不是維護舊功能做完善修改呢么,又不是寫新代碼,只能在現有代碼基礎上修改啊,你又不能大幅重構。
代碼測試?你丫需求討論期、產品設計期、設計評審期那麼長,都把研發項目時間佔光了,就留下2個星期讓我們寫代碼,我們哪裡有時間搞那麼深的測試。還想讓我們搞結對編程?還想讓我們搞測試驅動開發?
而且你看測試,什麼功能測試、集成測試、性能測試、安全測試、安裝部署測試、升級測試、遷移測試、UAT測試,一大堆測試,測試也需要很多時間。
一個項目,需求討論、產品范圍規劃與評審、產品設計與設計評審佔了一個半月,開發+自測就一個月,測試佔了一個半月,這就4個月了啊。
三、為啥程序員寫代碼總是寫寫測測?
剛才大家也都看到了,大部分程序員都是從界面代碼開始寫起,而且寫一寫,就運行一下看看。為什麼會是這種開發方式?
那是因為大部分程序員缺乏在腦子中的整體建模能力。只能做出來一點,真實的感覺一下,然後再往下。
有些是產品經理的上游就有問題,沒給出業務流程圖(因為產品經理也沒做過業務),也沒畫清楚產品功能操作流程圖。
為啥沒給出業務流程圖?因為產品經理不熟悉業務,另外,產品經理也沒有流程建模能力啊。為啥沒畫清楚產品功能操作流程圖啊?因為不會清晰表達流程啊。
很多產品經理、程序員,都缺乏分類、分層、相關、先後能力,更別說總結、洞察能力。
這是基本訓練,是一個做事頭腦清醒的人必備的技能,這不是一個程序員或產品經理或測試員的特定技能要求。
我經常看書就梳理書的脈絡,每看一本就寫一篇總結。我過去閑扯淡還梳理過水滸傳、紅樓夢的人物關系圖呢,其實就在事事上訓練自己的關聯性、層次性、洞察性。
我經常面試一個人時,我會問這樣的問題:「你把我剛才說的話復述一遍,另外你再回答一下我為什麼會這樣?」,其實,我就在看一個人的細心記憶、完整梳理、重現能力,我也在看一個人的梳理、總結、洞察能力。
我個人寫代碼就喜歡先理解業務流,然後理解數據表關系,然後理解產品功能操作流,大致對功能為何這樣設計、功能這樣操作會取什麼表、插入或更新哪些表,哪些表的狀態欄位是關鍵。
然後我寫代碼的時候,就根據我所理解的業務流、功能操作流、數據輸入輸出流,定義函數,定義函數的輸入與輸出。
然後,我會給函數的輸入值,賦上一些固定值,跑下來看看能否跑通這幾個關聯函數,看看還需要怎樣的新增函數,或者看看函數的輸入輸出參數是否滿足跑通。
剩下的事,就是我填肉寫詳細邏輯代碼了。
當然,大部分人沒我這樣的邏輯建模能力。怎麼閱讀理解也想像不出來,也沒法定義函數。畢竟有邏輯建模能力的程序員都很少,100個人里有10個,已經是求爺爺告奶奶好幸運了。
那怎麼辦呢?
我建議是分離分工配合,這就是現實中沒辦法的辦法。讓有邏輯建模能力的人來設計函數框架、來設計工具來設計代碼模板,然後讓沒有邏輯建模能力的人來填肉寫詳細邏輯代碼。
我們可以先從最緊要的模塊開始這么做。不緊要的模塊,還讓它放任自流,讓熟練手程序員繼續塗抹。
我曾經還讓有頭腦的程序員做榜樣,給大家分享他是怎麼規劃函數的,怎麼做維護性代碼的代碼結構改善的。但是發現效果並不佳,其他人並沒有因此能做代碼設計。可能邏輯建模能力是個人的基本素質,是從小到大訓練成型的,不是你一個大學已經幾年的人能夠短時間內可以訓練的。
所以啊,還是讓能走的人先走,讓從最緊要的模塊開始這么做。
不必擔心這樣做後,因為過去一件事被分工(一個做代碼框架一個填肉)成兩個人做了會降低工作效率。我們很多的工作效率低就是因為半瓶子醋搞出來的,來回反復修改。
真是應了劉德華在電影里說的那句話:說你又不聽,聽又聽不懂,聽懂了又不做,做又做不好,做不好還不服氣。
四、為什麼大部分程序員不做代碼測試或白盒測試或單元測試呢?
還是因為沒有代碼設計。因為沒有函數啊。所以,一個按鈕功能有多復雜,代碼就有多長。我見過2000行的函數,我也見過1000多行的存儲過程和視圖SQL。怎麼做白盒測試啊,這些代碼都粘在一起呢,要測,就得從頭到尾都得測。
所以啊,先學會設計函數,先寫好函數,這就求爺爺告奶奶了。很多開發了5年的熟練手程序員,可能都未必會寫函數。
函數的輸入輸出值就很有講究。很多人都寫死了,隨著版本迭代,發現過去定義的函數參數不夠用了,於是就新增了一個參數。然後,相關性異常就爆發了,其他關聯的地方忘改了,到底哪些有關聯,怎麼查啊,本系統沒有,沒准其他系統就調用你了,你根本不知道哪個神經人曾經COPY過你的代碼修吧修吧就改成了他的功能呢,而且裡面的很多代碼他看不懂也不敢刪,只要他實現的功能正常了他也不管了。於是,你改了你這個函數,他的系統就莫名出錯了。
所以,我一般會定義幾個對象來做參數。另外,我也很注重函數的日誌、函數的異常保護、異常拋出、異常返回。另外,我也很注重參數輸入值的合法性校驗。
所以啊,應該開發Leader們先制定函數編寫規范最佳實踐,輸入輸出參數怎麼定義比較好,函數的返回值如何定義比較好,函數的日誌記錄應該怎麼寫比較好,函數的異常保護、異常拋出、異常返回如何寫比較好。先教會一般程序員,先從會寫函數開始啊。
當然,你光有一份規范,程序員們還是不理解、不實際應用啊。所以,還得Leader們做好典型的代碼模板,裡面是符合函數規范的代碼框架,只有這樣,一般程序員們才會照貓畫虎適應了函數設計的編程習慣。
所以啊,我專門重新定義了leader的明確職責,其中第一個重要職責就是:負責工具/框架/模板/規范的制定,並且負責推廣且普及應用落地。
你不明確定義Leader的這個重要職責,你不對這個職責做明確的KPI考核,誰尿你啊。你以為好的工具/框架/模板/規范是靠人們的熱情、自發產生的么?我們還沒有那麼自覺高尚啊。
五、為什麼大部分程序員不寫注釋啊?
我經常說一句話,千萬別多寫注釋。為啥?
因為我們經常遇到的問題不是沒有注釋,而是更糟的是,注釋和事實代碼邏輯是不相符的。這就出現常見問題了:殘存下來的設計文檔是一個邏輯、注釋是一個邏輯說明、真實代碼邏輯又是一個,鍾表多了,你也不知道正確時間了。
所以啊,產品文檔、注釋、真實代碼,三者總是很難一致同步。我為了幾百人研發團隊能做到這個同步花了大量心血和辦法,但我最終也沒解決了這個問題,還把Leader們、總監們、我都搞的精疲力盡。
索性回歸到一切一切的本源,代碼,就是程序員的唯一產出,是最有效的產出。那麼,讓代碼寫的不用注釋也能看懂,咱得奔著這個目的走啊。
為啥看不懂,不就是義大利面條式代碼么,又長又互相交雜。
OK,我就規定了,每個函數不能超過50行。用這一個簡單規定和靜態代碼檢查插件,來逼迫大家嘗試著寫函數。有的函數屬於流程函數,是串起其他函數的,有的函數就是詳細實現函數,實現一個且唯一一個明確作用的。
有了流程函數和功能函數,而且每個函數不超過50行,這就比過去容易看懂了。
六、為什麼大部分程序員不抽象公共函數啊?
我經常說一句話:千萬別抽象公共函數啊。為啥?
因為大部分程序員缺乏抽象洞察能力。特別是有些積極熱情有餘、愛學習愛看書、半瓶子醋晃悠的二桿子,看了幾本UML、重構、設計模式、整潔代碼之道,就躍躍欲試了,還真敢給你抽象公共函數了。
一開始,他覺得80%相似,20%不相似,於是在公共函數裡面簡單寫幾個if..else做個區隔就可以。沒想到,越隨著版本迭代,這些功能漸漸越變越不一樣了,但是這個代碼已經幾經人手了,而且這是一個公共函數,誰也不知道牽扯多少,所以誰也不敢大改,發現問題了就加一個if..else判斷。
沒想到啊沒想到,這個本來當初公共的函數,現在變成了系統最大的毒瘤,最復雜的地方,誰也不敢動,除非實在萬不得已,手起刀落。
所以,我平時告誡程序員,純技術的、純通用的,你們可以嘗試搞搞抽象公共函數,對於業務的,你們還是簡單粗暴的根據Leader們做的代碼模板代碼框架,乖乖的復制、修改、填肉吧。
你們啊,先從做模板做代碼片段開始吧,咱們放到咱們內部代碼片段開源庫里,看誰的代碼片段被別人復制的多,說明你的代碼抽象設計能力越好了。那時候,我就大膽放心讓你撒丫子跑了。在沒有學會跑之前,給老子乖乖的復制、修改、填肉吧。