乙個典型的 c++ 程式設計師成長經歷:
1. 完整的學一遍 c++ 所有語言特性,典型書籍"the c++ programming language" part1, part2, "c++ primer"
感覺 c++ 像大雜燴(多程式設計范型),各種精妙的語法特性 (friend, virtual/rtti, const/mutable, exception, template),太多精妙的東西容易導致記憶瑣碎化,學了又忘了,尤其是那些很少用的部分
實踐:編寫一些帶 class 和 virtual 字眼的所謂的 c++ 程式
2. 樹立 c++ 的規則,明確在 c++ 世界「合法的並不一定是合理的」,典型書籍effective c++ 系列
有些東西可用 c++ 寫,但一般情況下並不合理,如 protected 成員資料, 覆蓋 non-virtual 成員
實踐:發現 c++ 有強烈的語義約束,和次語言 (sub-language) 範疇,開始寫一些規矩的**
3.1 為了使上述的約束更加形式化,開始使用
設計模式,典型書籍"the c++ programming language" part4, "design patterns"
實踐:教條的套模式,與人協作,編寫真實規模的程式
開始想:有時傳統的設計模式對 c++ 很難看 (oo),有沒有一種原生化的 c++ 模式實現思路(以便利用 c++ 的高效性),開始對靜態型別系統和模板推導著迷 (gp)
3.2 為了開發快捷,開始使用
標準庫,典型書籍"the c++ programming language" part3, "the c++ standard library", "effective stl"
光用標準庫是不能滿足真正的 c++ 程式設計師的好奇心:auto_ptr, iostream 這些精妙的東西是怎樣實現的?string 的開銷究竟有多大?functional/alogrithm, iterator, container 這三者是怎樣分離的?
於是開始閱讀某個標準庫實現(典型的是 hp-sgi 的實現,但建議 windows coder 讀 msvc 的),並嘗試自己的等價實現,雖然可能只是標準庫的一部分功能。這裡乙個很大的驅動力是重視 c++ 的高效性
至此,已經知道如何在 raw/smart pointer, char*/string, static/dynamic bind, array/stl container 之間抉擇
實踐:編寫可穩定工作的程式,重視模組的復用性和擴充套件性,並理解將書本模式(學院派)實化為優質的 c++ **之間的鴻溝
4. 插曲:3.1 和 3.2 過程會交替重疊進行,並導致
重學 template c++ 這個次語言,典型書籍"c++ templates: the complete guide"
5.1
玩轉 template c++ 和 gp,發現它是超強的**生成器,和模式塑型器,典型書籍"modern c++ design"
開始進入一種偏執狂式的 gp 和模式應用狀態:
2. 把所有的概念都抽象化, abstract class/factory
3. 把所有的行為都策略化, 動態的: strategy, 靜態的: traits, policy
4. 把所有的實現都向標準庫靠攏, think in stl: every io is iostream, every algorithm uses iterator, every container is type-safed and nonintrusive with specialization for optimization
成也蕭何敗蕭何:炫技和實用只在一念之間
至此,幾乎每個 c++ 程式設計師手上都有自己的乙個 semi-stl 的私人庫,那是多年的積累
實踐:編寫工業強度的 c++ 程式,你的一部分**(庫)可能以開源或閉源的形式供他人使用
5.2 開始使用
乙個 think in stl 的叫做 boost 的東西,於是你對 boost 做了和上面 stl 同樣的事,典型書籍"beyond the c++ standard library", "boost docs", "boost 程式庫完全開發指南"
也許還對 c++11 感興趣,現在可用即 tr1,典型書籍"the c++ standard library extensions"
實踐:以較高的效率編寫工業強度的 c++ 程式
5.1 和 5.2 過程會交替重疊進行
6. 過度的玩 template c++ 將會導致
元程式設計,典型書籍"c++ template metaprogramming"
儘管它很炫耀,但生產環境中卻很少用
補充:既然認為 tmp 是 turing-complete 的,並且秉持 handy coding 和 compiling is running 的理念,實際上你是需要乙個動態語言(把 c++ 編譯器當直譯器用,而且還不能除錯)。再將範圍縮小:從目前 c++ 社群工作來看結合最成熟的 interop 語言是 python
實踐:地球很危險,回火星去吧
7. 乙個高質量的 c++ 程式所在的商業專案失敗了,導致你
陷入沉思
考察失敗的可能原因:
1. 商業決策,和 c++ 無關
2. 其實是部分高質量 c++ 程式,高質量的模組由優秀程式設計師編寫,其它人的很爛
辦法 1. 你很喜歡現在的團隊:循循善誘那些新手,讓他們經歷你的至少 2-3 階段,短時間領悟是不可能的,你很清楚
辦法 2. 離開去找和你水平相當的人,記住:c++ 是真正懂它之人的利器,而是一知半解者的絞繩,還不如完全不會用 c++
3. 過度的個人炫技,導致**複雜度過高
不易理解、難維護、開發時間長
4. 需要乙個度
1. 實現復用性和擴充套件性的難度不宜超過團隊的平均水平
2. 團隊的平均水平不宜低於同類產品開發的市場競爭者的平均水平
5. 需要乙個目標和態度
1. 以製作可交付使用,可工作的產品為終極目的
2. 做最好產品,而不一定用最好的技術
8. 返璞歸真
屠龍之路 堅持就是勝利 NinthDay
站立式會議 人心齊,泰山移。團隊一起編碼不僅使得整體的工作效率有所提公升,同時也加強了隊伍的凝聚力,並且培養了隊員之間的默契。這也讓我們獲得了開發的新鮮感。子曾經曰過 還有什麼事是乙個程式猿所解決不了的?如果有,那就一群吧!屠龍家族 日常完成 感悟少銘 解決bug,調整心態。日常除心魔 1 2 3 ...
3年的程式設計師之路貴在堅持
前言 匆忙寫了這些記錄我這個時候的感受和啟發,也希望給和我有同樣感受的人一點觸動。正文 初入程式設計師是在受到了老大哥的啟發,老大哥後來開了公司,我就算是走了後門以實習生的身份進入了公司。從大學實習到近期,途中受到了公司裡大多數人的質疑,什麼文科不適合幹程式設計師之類的。其中有3件事情給我的影響挺大...
堅持開源軟體的創新之路 陸首群
我國it產業的創新工作 我國是全球it產業發展的後起者,我們肩負為我國it產業生存 發展和提公升而搏弈的歷史重任。走自主創新之路,將是這場搏弈勝出的關鍵。積體電路和軟體是it產業的兩個支柱。近年來國內圍繞這兩個支柱產業的創新歷程為 在積體電路方面,國內自主開發了中低端通用微處理器 cpu 晶元整合系...