首先,這裏要把程序員的概念放寬一點,無論是分析的,仍是搞設計的或者編碼,測試的,都叫作程序員。也就是說,這裏以程序員泛指全部軟件實現過程當中所涉及的全部人員。可是不包括如配置管理員,數據庫管理員,測試工程師這樣的職位。由於這裏討論的僅僅是軟件的構建,與驗證、管理等其它周邊事務都無關。程序員
第一個要考慮的就是併發編程。好比多線程,它是否真是程序員本應該涉及的領域。程序員是否真的應該費大量精力去研究它,以便而後才能在現實工做中正確地使用它?數據庫
這是形式語義學討論的範圍。形式語義學討論的就是語言元素的語義。其實我以爲它應該討論得更多一點,好比比語言層次更高一點的如庫(Library),平臺,操做系統服務,本地服務,協議等的語義。編程
程序員應該幹什麼??安全
根據不重複發明輪子的原則,全部編程中的共性部分都不該該是程序員的職責。程序員只應該對商業邏輯負責。程序員固然還要負責這些邏輯的運行時實現效果。也就是說,程序員負責的部分包括兩個:網絡
1,程序的靜態特性;多線程
2,程序的動態特性。架構
簡而言之,程序員應該是最終的產品責任人。這並不意味着程序員會負責整個系統全部的部件質量,也不意味着程序員只負責本身編寫的程序部分。程序員對於因須要引入的任何系統構件都擁有責任。但這種責任是一種使用者責任,是區別於開發這些構件的生產者責任的。這就象我買了個手機,手機不是我生產的,但我仍然對它的質量負有責任:使用者責任。不然我就不會在購買的時候問東問西了。我問東問西,由於我關心它的質量,這個詢問過程即體現了個人一種承擔責任的態度。併發
承擔使用者責任,須要的是對所使用產品的輸出特性的理解。這種輸出特性可能由生產者定義,也可能由第三方定義,也可能由使用者本身定義,毫無疑問的是,它必須被定義。若是產品的輸出特性都不重要了,那麼就沒有任何東西是重要的了。測試
因此一個面向對象的程序員,應該至少擁有兩種能力:編碼
1,構建必要對象的能力(不必定是領域建模。由於前面提過領域建模只是面向對象的一種方法而已。面向對象的方法論並不必定要求只能對領域建模。面向對象的方法論的要求是:你的系統是由對象組成的);
2,理解大部分軟件產品的輸出特性的能力。好比數據庫,支撐平臺,操做系統,網絡(因特網),安全,硬件等等。其中有些產品是有形的,有些是無形的如安全產品。這裏所指的安全產品,是指做爲組成安全方面的所有元素其中的所有產品。
固然,在技術之外,程序員若是懂得更多的東西那固然是好事情。如項目管理,軟件質量與測試,IT審計,配置管理,系統架構,,,由於這些都是處在軟件價值鏈上面的東西,懂得越多固然越好。
若是很差,那就是科學的錯誤了。