天天看點

寫給新手Android程式員的一封信

寫給新手Android程式員的一封信

Photo @  碼農專欄

文  |  Jaynm

“當你不創造東西時,你隻會根據自己的感覺而不是能力去看待問題。”

歡迎來到程式員的世界。在這個世界上,不是有很多人想創造軟體并解決問題。

對于下面的文字你不必完全接受,所有這些來自一個其貌不揚的程式員。我喜歡把事情做到最好,而不是對原來的東西修修補補。

僅僅是因為愛好開始做一些創新,這是一個很好的開始!如果你說“我要先學習一下再開始做”那麼你永遠不會真正開始。每個人都需要從某個地方開始,是以現在打開你的編輯器開始寫代碼吧。

下面是一些很重要的建議,雖然有人并不認同,但我保證你看完我的分析以後會站在我這一邊。一開始,先不要管算法和資料結構。大多數簡單的程式不需要用到算法和資料結構,是以當你真正需要時再去學習。程式設計一段時間以後,你就會知道在哪些地方用到他們。這時知道算法的名字并了解它們的功能,然後找一些相關的論文去了解算法并動手程式設計實踐。如果沒有現成的函數庫(其他程式員提供的可重用代碼),你用自己喜歡的程式設計語言來實作它。

01

一、 選擇一門好的程式設計語言,一門你自認為可以用它快速地做出一些有用東西的語言。

Java 是 Android App 開發預設的語言, Android Framework 也是預設使用 Java 語言!既然選擇了Android開發,那肯定必學Java。

Android入門的時候,需要有一本入門書,好好學習書中的内容,同時花一年時間把Android官方文檔中的training和guide看一遍,同時通過寫部落格和記筆記的方式來做總結,建議讓自己的每篇部落格都有價值些。通過一年時間的學習,相信每個人都可以達到中級工程師的水準。

技術要求:

  • 基本知識點

比如四大元件如何使用、如何建立Service、如何進行布局、簡單的自定義View、動畫等常見技術。

  • 書籍推薦

(1)入門階段:

  • Android開發進階 從小工到專家
  • Android自定義控件開發入門與實戰

(2)進階階段:

  • Android開發藝術探索
  • Kotlin實戰
  • 實戰Gradle
  • Android Gradle權威指南
  • Android進階解密

(3)想好好學習framework:

  • Android 源碼設計模式解析與實戰 第2版
  • 深入了解Android核心設計思想 第2版(上下冊)
  • 最強Android書:架構大剖析

(4)Android 某個領域精深了解:

  • 深入探索Android熱修複技術原理
  • Android音視訊開發
  • Android元件化架構

(5)鞏固一下基礎:

  • Java并發程式設計之美
  • 碼出高效:Java開發手冊
  • HTTP權威指南

(6)改善下代碼:

  • 代碼整潔之道 程式員的職業素養
  • Head First 設計模式(中文版)
  • 重構 改善既有代碼的設計 Java語言版

(7)好好學一下算法:

  • 算法圖解
  • 算法(第4版)
  • 大廠面試寶典更新版(劍指Offer+程式設計之美)

(8)深入了解下 Git:

  • 精通Git 第2版

02

二、下面說的一些基礎,可能絕大部分開發人員都不會在意甚至忽略,但恰恰這些才是開發大廈的基石。

1、科學基礎

成為開發人員的過程不盡相同,有的是科班出身,有的是興趣愛好,還有的是專業機構的教育訓練,在這個過程中,可能全面或者零散甚至沒有學習過計算機基礎學科,但無論是哪一種,想要成為更高層次的開發人員,寫出更高品質的代碼,計算機基礎學科的學習,是非常非常非常(重要的事情說三遍)重要的。具體的來說,基礎學科在實踐應用中,有如下幾門是一定需要的,按照學習順序排列如下。

1)資料結構

資料結構課程通俗的說就是告訴你如何用最基本的語言類型、變量,關鍵詞語句等,去處理各式各樣的邏輯問題,我們稱之為算法,而日常程式設計中的各種問題,例如排序、檔案夾周遊操作、資料庫查詢等,都可以在資料結構課程中,找到對應的數學原型。資料結構課程的了解能力,也是一個人數學能力的展現,資料結構學習的好壞,是程式員水準差異的一個重要分水嶺,對于這一塊内容的學習,有如下建議:使用VB、C、C++、Pascal等語言,買一本相關語言資料結構與算法的書,或者在網上下載下傳相關的PDF電子書,完整的學習一邊,并将書本中的所有案例親自編寫運作調試一遍,當能夠領悟到某些日常程式設計中常見手法源于某些資料結構和算法時,就基本達到了學習效果。

2)作業系統

所有程式設計語言的開發以及應用的運作,都基于作業系統,桌面程式設計中的大部分場景包括記憶體、程序、檔案系統、網絡通訊、使用者界面等,都源于作業系統的定義和概念,完整的了解作業系統的起源群組成以及運作邏輯,對多線程、複雜界面、檔案管理以及一些難以正常了解程式設計思路等開發中遇到的場景,有非常大的幫助,不僅幫助了解,也能掌握更多有效的程式寫法。具體可以買一本作業系統的書或者下載下傳相關PDF電子書,完整的浏覽一遍,做到能夠結合實際程式設計場景來看待作業系統原理,就基本達到了學習效果。

3)資料庫

傳統的關系型資料庫,入門簡單,深入卻難,往往開發人員能夠較快的掌握增删改查、視圖、索引、存儲過程等基本資料庫操作,卻在編寫複雜查詢、設計主外鍵、優化字段、去除備援等時,出現隻會依葫蘆畫瓢卻不能自主思考擴充的狀況。究其原因還是沒能了解關系資料庫的根本原理,而資料庫這一門課程,系統的闡述了關系型資料庫的來龍去脈,了解其中的數學原理或邏輯基礎所在,對提升資料庫程式設計水準有質的影響。建議也是買一本資料庫的相關書籍或者下載下傳PDF電子書,能夠把熟練的把第一範式、第二範式等資料庫課程的基本知識點與資料庫程式設計場景建立起關聯,也基本達到了學習效果。

2、英語能力

英語的天然特性和字母長度還有學科發展的曆史因素,決定了程式設計語言一定是基于英語的,在程式設計過程中,從語言的關鍵詞到文檔的内容又或是搜尋引擎的搜尋結果,都不可避免的會遇到英文。大部分程式設計人員,都具備英語四級左右的英文基礎,卻由于非專業以及工作環境原因,逐漸疏遠甚至完全淡忘了英語。而實際操作中,大部分程式設計語言資料都是英文,線上程式設計問答内容也是英文,是以,很有必要把英語能力重新恢複到一個不用太高但行之有效的水準,達到如下效果:

1)對自己所使用語言,每一個關鍵詞都知道具體的英文翻譯、邏輯含義以及讀音。

2)對于自己使用語言所涉及到的相關方法、類庫、架構、工具等,能知道其中每一個方法、過程以及參數關鍵詞等的英文翻譯、邏輯含義以及讀音。

3)對常見的程式設計邏輯和核心關鍵詞,能夠用英文組織問題的描述,最簡答的也行,隻要能被搜尋引擎讀懂就可以。比如如何在C#中把整形轉換為字元串類型這個問題,最簡易的英文描述就是 C# Integer Covert To String。

4)在自己技術知識範圍内的任何的英文的技術手冊、文檔、文章或是問題描述,能夠讀懂8成的内容含義,能夠讀懂完整的技術含義。

3、思維模式

開發人員,一定要養成業務思維的模式,所謂的業務思維,就是在做任何一個項目的時候,寫任何代碼前,需要對項目本身的業務概念和業務邏輯甚至業務流程都要有一個全面的學習和了解,這雖然不是一個項目的強制要求,卻是一個很好的開發習慣,無論自己的覺得是開發者還是測試員又或是技術總監,掌握了業務原理,才能夠更好的設計或閱讀項目的資料結構和流程結構。程式員的思維往往和使用者或者客戶是不一緻的,擺脫技術思維模式,習慣于用業務思維解決問題的程式員,不一定最優秀,但一定是一個很容易溝通的程式員

4、工作與程式設計習慣

有的人說愛幹淨浪費時間,是以不修邊幅,但歸根結底這還是習慣問題,當養成清潔衛生的習慣并使之成為生活慣性時,往往就不會耗費更多的時間,反而顯得幹淨幹練。寫程式同樣如是,有一些程式設計習慣,看似不足為道,看似浪費時間,可是如果堅持下去,最終都能收到意想不到的奇效。下面列舉一些特别重要的習慣。

1)快捷鍵的使用

無論是使用Windows、Linux作業系統,還是在IDE中,快捷鍵都是系統本身的标配,事實上,Ctrl+C、V這樣的操作,大部分人都能嘗到在節省時間上的甜頭,把這個概念進一步擴散,如果在IDE中編寫代碼,除了代碼本身,将其餘所有的滑鼠操作、鍵盤定位操作,都用快捷鍵來代替的話,在時間上将會有數量級的節省,然而看上去這麼好的事情,真正堅持去執行并形成習慣的人屈指可數,是以,在初期的改變習慣,記住快捷鍵,會是一個長期的過程,需要不斷的堅持。

2)代碼注釋

一個開發人員随着年齡和經驗的增長,所參與的項目,再也不是靠一個人或者幾個人就能完成的。系統的重構、代碼的重構、工作的交接、對新進人員的教育訓練等等類似的事情,會越來越多的遇到,這些事情無一例外都會把已經寫過的代碼重新或者重複閱讀,如果在初始編寫代碼時,就做到完整、清晰明了的代碼注釋,對後續工作會有巨大的幫助。不僅提高工作效率,還能增強合作好感。事實上,就算隻是自己看自己的代碼,如果有注釋,也能加深印象,縮短代碼查找時間。是以,任何開發人員,都應該養成良好的代碼注釋習慣。

優秀的代碼注釋應該能做到:

每一個函數、每一個屬性甚至是變量的劃分,都可以找到對應的解釋。多使用越來越被IDE支援的XML注釋方式,不僅有注釋文字,更有詳細的參數描述。對程式結構、子產品、組成部分劃分等也加以注釋。

3)命名規則

具備一定規模的軟體公司,在代碼編寫上都有一套自己的命名規則,涵蓋項目、子產品、函數、變量等等,标準化命名的好處不言而喻,然而被動、被迫去遵守命名規則和主動習慣于使用命名規則是完全不一樣的。一個優秀的開發人員,應當發自内心的希望各種代碼命名都是有規則的,易讀的,而不是糾結于命名規則會增加碼字長度。

4)不将就的程式設計邏輯

所謂不将就的程式設計邏輯,其對立面就是不講究的程式設計邏輯,不講究的程式設計,不僅是一種很壞的程式設計習慣,也展現了低下的生活品質,很多開發人員,因為個人習慣、趕工期、客戶要求不高等多種原因,在程式設計時特别随意,展現在比如為了實作某個功能,百度出一段代碼,直接套用,10行的代碼隻了解8行,有兩行看不懂也放到程式裡去使用,很多這樣的小細節,就好比在項目中埋下了無數的定時炸彈,不僅有很大機率形成返工,更是為項目埋下了風險。程式設計人員,應當有擔當有态度,養成不将就的程式設計邏輯,不勉強自己,也不輕視程式。

5)資料備份

誤删、誤操作、電腦斷電、檔案遺失等等狀況是每一個開發按人員都可能遇到的問題,如果不希望辛勤的勞作被浪費,不希望偶然的意外影響工作,那做好備份是必不可少的,在較大規模的公司,會有完整的源代碼管理以及資訊安全防護,而無論是在大公司工作,還是身處較小公司或者在實作個人代碼價值時,都要做好代碼和文檔的資料備份,備份方式的選擇靈活多樣,有使用線上的CVS、SVN、TFS、Git源代碼管理,也可以手工拷貝檔案至雲空間或者本地硬碟,甚至可以在個人電腦上組成RAID磁盤陣列等等,養成周期性、規律性的備份習慣。

6)郵件工作方式

溝通是進步的源泉,如果說開發小組的熱烈讨論是性格和激情的展現,那郵件的工作方式也是另一種穩重和高效。無論是公司層面的工作溝通,還是開發小組的問題交流,郵件的作用包括問題正規化描述、工作留檔留痕、工作流程流轉、責任分工明确等等,習慣于将重大問題、重要事項通過郵件的方式與同僚、主管等進行溝通,将會非常有助于團隊協作。

03

三、一線網際網路移動架構師進階技能

1、基礎技能:

1、深入Java泛型

2、注解深入淺出

3、并發程式設計

4、資料傳輸與序列化

5、Java虛拟機原理

6、反射與類加載

7、高效IO

2、Android架構體系架構

1、進階UI晉升

2、Android元件核心

3、大型項目必備IPC

4、資料持久化

5、Framework核心解析

3、360全方面性能調優

1、設計思想與代碼品質優化

2、程式性能優化

3、開化效率優化

4、設計思想解讀開源架構

1、熱修複設計

2、插件化架構解讀

3、元件化架構設計

4、圖檔加載架構

5、網絡通路架構設計

6、RXJava響應式程式設計架構設計

7、IOC架構設計

8、Android架構元件Jetpack

5、NDK子產品開發

1、NDK知識體系

2、底層圖檔處理

3、音視訊開發

4、機器學習

6、架構師煉成實戰

1、架構設計

2、網上商城項目實戰

3、新聞用戶端項目實戰

4、多格式播放器項目實戰

5、Gradle自動化項目

7、微信小程式

1、UI開發

2、API操作

3、微信對接

8、Hybrid開發與Flutter

1、Html5項目實戰

2、Flutter

04

四、學習分享

我意識到有很多經驗和知識值得分享給大家,也可以通過我們的能力和經驗解答大家在IT學習中的很多困惑,是以在工作繁忙的情況下還是堅持各種整理和分享。

但苦于知識傳播途徑有限,很多程式員朋友無法獲得正确的資料得到學習提升,故此将并将重要的Android進階資料包括自定義view、性能優化、MVC與MVP與MVVM三大架構的差別、NDK技術、阿裡面試題精編彙總、常見源碼分析等學習資料免費分享出來。

希望我能夠用我的力量幫助更多迷茫、困惑的朋友們,幫助大家在IT道路上學習和發展。