大多數程序員一個人連一個稍過複雜的桌面軟體都做不出來嗎?在普通的公司里程序員的工作是什麼樣子?新手怎樣得到提高?
大多數程序員一個人連一個稍過複雜的桌面軟體都做不出來嗎?
不是。大多數工作過 10 年以上的程序員,完全可以獨立寫出 Mac App Store 中定價在 4.99 美元之下的大多數軟體,其中很多足夠複雜(這裡指通過本身的功能直接收費的軟體。通過其它盈利模式的大型免費 app 除外,比如 Evernote)。但是寫這樣一個軟體需要的不僅僅是技術,還有投入。大概需要幾個月到一年的時間全力投入。需要解決核心功能之外的很多問題,比如所有功能都要支持 undo/redo(甚至是無限次 undo),texture/icon 要設計的美觀(雖然有人說這是 designer 的職責,但是大多數程序員藉助 Google image 和簡單 Photoshop 技能其實也可以做到)。在普通的公司里程序員的工作是什麼樣子?
很多程序員把自己寄放到團隊中。不是因為自己技術上不能,而是因為在投入上不想冒風險,在非核心功能上不想介入過多。就像有的人喜歡自己開公司造飛機,但是有的人喜歡給空客造機翼。新手怎樣得到提高?理解了這個情況。怎麼都能提高。
我以前編web的時候也在想為什麼自己不能寫齣兒時熟悉的window桌面程序來,結果現在我就是在編window桌面程序了,發現也沒什麼特別的,確實是術業有專攻。很多window桌面程序的程序員還對web開發望而生畏呢。
被邀請。這個題目問得很有意思,答答看。
發現提問者在一個問題里包含了三個子問題。一個一個來回答。
大多數程序員一個人連一個稍過複雜的桌面軟體都做不出來嗎?
是的。確實如此。如其它答案所說,程序員也有分工,做桌面程序的、做網路程序的、做移動終端程序的、做大型機編程的、做小型機編程的、做單片機編程的……即便同是做桌面程序的,不同的操作系統下的寫法也有很大不同。術業有專攻,一直鑽研其他領域的人,哪怕是高手也可能對桌面程序的運行機制和構建方法不熟悉,從而無法完成這個任務。但我想提問者想問的可能不是這方面,而是想問在一個做桌面軟體的公司里,也可能有大部分程序員無法獨立編寫一個稍顯複雜的桌面軟體。如果回答問題——很遺憾,我仍然認為這一現象在某些公司是可能存在的。根據我的觀察,任何行業,兢兢業業做事情,並且做事時肯主動動腦思考前因後果、願意主動擴大自己工作責任範圍的人總是很少(後面我們管這種人叫主動哥吧)。大多數人都是習慣於只做被分配的一片任務,並按照被吩咐的做法去做,對擴展自身工作範圍和知識沒有什麼興趣,僅在被分配了新的工作內容時才去學習(讓我們管這種人叫被動哥)。我並不鄙視被動哥,因為畢竟這個世界的大部分財富是他們創造的,大部分工作是他們完成的。他們中不乏好人、熱心人,但他們的缺乏求知慾導致他們會長期保持某一狀態。放在做程序上,以Windows桌面編程為例,如果一個被動哥被分配只需編寫一些函數調用其他人開發好的API,並通過其他人寫好的框架來做測試,那麼他很可能在完全勝任工作的前提下不了解任何Windows桌面程序從頭建立的方法。自然就不可能獨立完成一個桌面軟體了。從大工業生產來看,這一點對公司是有利的,因為工作的成敗將不僅僅取決於某幾個員工,而且隨時可以替換任何一個被動哥,也就意味著隨時可以找到成本更低的人才。日本很多軟體公司中的程序員都是這種狀況。相對來說,中國的一些看似不太成熟的公司反而好些,裡面的人什麼都得做,哪怕是超級被動哥也什麼都會了。另一方面,主動哥往往容易得到上級的賞識,很快便從程序員升級為設計者、架構師、管理者、顧問……長此以往沉澱在程序員階層的大多是被動哥,那麼大多數程序員無法做出一個像樣的東西也就不足為奇了。
稍微跑題一下,我從來認為跟某客服打交道碰到態度好、能力強的人是我的大造化。因為根據上面的理論,作為一個客服,既能全面掌握所負責的產品的知識,又能態度很好地提供服務,並具有很強的溝通能力,這種人不會在第一線做太久的。所以第一線的客服普遍要麼態度差,要麼微笑提供無效答案就是太正常的事情了。在普通的公司里程序員的工作是什麼樣子?
這個問題里的普通的公司不知道指什麼。我沒跳過很多公司,恐怕沒法給出全面的答案,只說一下我所待過的地方。首先明確一下程序員的定義:大部分情況下不負責設計,僅負責編寫代碼並進行最小限度的單元測試,同時在被要求的情況下撰寫相關文檔。在這種定義下的程序員,常常就是對著詳細設計書進行代碼翻譯工作。對於一個有思想有抱負的人來說是很枯燥乏味的。我曾經見到過快要達到偽代碼級別的設計書。如果拿在手裡的不是列印出來的紙張,隨便寫個宏什麼的,基本都能把代碼生成出來的。但也不排除有時設計書做的不完整或者質量低下,這時候就需要向設計者發問,並承擔一部分設計工作。相對會有趣一些。但對知識不豐富且沒有設計經驗的人來說,這項工作是個噩夢。尤其跨國協作時,要用外語探討時,有些外語不好的人就徹底繳械了,三天兩頭請外語好的人吃吃喝喝的……如果用廣義的程序員,也就是代表一切偏技術的IT工作者(包括設計師、架構師、顧問等),那工作內容就五花八門了。作為架構師,在名稱的表面風光背後,要做很多艱難的抉擇——是使用這種技術還是那種?是用這種平台還是那種平台?是犧牲功能還是犧牲性能?作為顧問,其實很多真正喜歡悶頭搞技術的人一不小心當了顧問之後都大驚:我這跟搞推銷的有啥區別?啥時候才能讓我再次打開久違的IDE(集成開發環境)或者記事本(拽點的人用Vim),敲兩行代碼啊?!因為他們的主要工作是研究客戶的業務,並提出一個可以滿足客戶業務需求的IT解決方案。他們對IT技術可以說基本什麼都知道但什麼都不深入。(當然也有一些超人,在完成任務的基礎上自行抽時間鑽研某方面技術。遇到這種人,就膜拜吧。)讓普通技術人員眼花繚亂的各種名詞是他們忽悠客戶最好的武器。然後就是去客戶現場忍著各種不爽做講演了。作為設計師,相對接近程序員一些。要把架構師定下來的東西更進一步細化,設計成程序員能實現的東西。
當然對於一些小公司和小項目,以上角色互有穿插,甚至一人全兼。(有什麼我漏掉的沒有?有的話,歡迎大家評論補充。)新手怎樣得到提高?這個問題,其實聰明點的人,從第一個問題里已經看到答案了。那就是做個主動哥,不要去做被動哥。雖然我知道,看到這句話會同意的人不少,真正能做主動哥的人還是不多。(我本人在某些事情上或某些時期也是被動哥……)因為這是跟質能守恆、相對論(那個超光速中微子最終還是因為電線問題沒能推翻相對論)之類一樣的自然規律。但人類的存在就是要做逆熵的事情,所以不做主動哥枉來人世一遭啊。細說一下,上面有人說要寫代碼過萬,這個數字我沒量過,但大量的實踐練習絕對是必須的。人都是不撞南牆不回頭的,不經歷大量的失敗是不會有成長的。甚至有人經歷了大量的失敗還是不成長,這就是我想說的實踐之外重要的一點,多動腦思考,讓自己成為一個合格的人類。為什麼是一個合格的人類呢?因為人類區別於動物的主要特徵就是有一顆懂得感恩的心……抱歉跑題了,應該是懂得進行複雜思考的頭腦。有些機械工作,哪怕是猴子、狗什麼的,訓練訓練也能完成,或者高手做個機器人,也可以完成。作為人類,一定要做一些需要頭腦的工作,哪怕工作本身不需要頭腦,也不要停止思考,想一想做這件事的前因後果,有什麼可以改進的地方或者提高效率的地方。長此以往,經過同樣的時間,你會比不合格的人類(是的,被動哥是不合格的人類)多學會很多東西,多具有很多能力。抱歉,一不小心又寫多了,關於新手提高,總結成兩個詞吧——勤奮和思考。完畢!程序員多了,人家又不是都做桌面軟體的,憑什麼要做「一個稍過複雜的桌面軟體」。再者,你以為程序員的工作很簡單嗎?就算是桌面軟體的程序員,人家又不是策劃/美工,軟體現在幾乎沒有單兵作戰的。你想提高,先把這些概念弄清楚了!
作為一個曾經在中小型IT外企(總人數6000+,研發人數2000左右)工作過三年的苦逼程序員,我認為自己還是有點資格來回答的。
我所在的外企是做CAD的,在該行業里算是老大吧,這種軟體算得上是典型的桌面軟體,代碼行數基本都在百萬到千萬之間(copy/paste代碼請靠邊站,這種行為是嚴格禁止的),我離職前參與開發的產品的代碼行數已經往千萬躍進了。這也只代表我能看到的代碼行數,還沒扯上用到的第三方庫,曾經有一次我統計了一下,光該產品使用的第三方庫頭文件加上二進位(pdb和lib, dll),超過2GB。
做這種大型軟體開發是非常苦逼的,全新編譯一次就要花很長時間,我的情況是,雙核3G單機編譯2個半小時,用上IncreBuild後十來台機器聯機編譯,也要一個半小時,編譯期間機器非常慢,啥都幹不了,因此多數同事都配了兩台PC。調試過程也是很痛苦的,經常VS調著調著就罷工了。一開始都不得其解,多次後才領悟到是因為PDB文件太大太多,VS載入過多導致內存不足。
PS:據同事說,微軟的window用伺服器級別的機器全新編譯一次要近40小時。
當時我們同事間基本認同一說法,再nb的新人若不經過三個月訓練,連怎麼往這產品上加代碼都不知道。 開發不停地往上加代碼,文檔不全,更新總是落後一步,每個人只負責一小塊,也只對負責的那一塊熟悉。新功能用到別人的那一塊怎麼辦?問啊,不停地找人問,郵件群發,打電話,直接找相關負責人,總會有人知道的。即使有人幫忙,也需要自己理清頭緒,理解相關部分的代碼結構,查看暴露的介面,看以前是否有做過類似的功能。有的話就參考,沒有的話就得仔細思考如何利用現有介面實現。
代碼提交戰戰兢兢,得多次確認,要不然break build的郵件可是會直接發到經理那裡去,一年要出現兩次break build,年終考核就有很大問題了。smoke test要通過,要code review,要確認代碼沒有衝突,點submit時心情都在祈禱不要出任何差錯……只是做一個feature,也要3,4個人花很多精力,規模效應導致開發難度呈指數級增長。
在這種情況下工作, 對各方面技能都是很大的鍛煉,包括性格。。我常開玩笑地對後來跳槽的公司說我優點是非常有耐心。這段工作經歷令我獲益良多。現在雖然我轉到ios開發,看到framework頭文件,我就能猜得出ios API的大致結構、封裝方式和使用方法。
再說一下如何提高:
1. 看代碼,別人寫的優質代碼。大型軟體的架構都非常良好,即便是API的封裝,也非常講究。沒有條件的話可以看大一點的開源項目,看別人是如何組織代碼結構,如何劃分模塊,如何應用設計模式的。2. 調bug。在調試bug過程中,會對代碼執行過程更加理解,同時加深對產品架構的理解。3. 多思考,多動手。使用第三方庫時,盡量和現有的掌握的知識聯繫上,就能有不一樣的體會。想想如果是你來寫,會希望使用者如何來調用,要如何來封裝才能實現你的目的。4. 和高手一起工作。榜樣的力量是無窮的,有人調教,進步會非常快。 暫時想到些,以後想到了再補充。大多數從事程序員工作可能都沒有獨立開發桌面軟體的經驗: 因為他們很多是網路工程師,移動設備工程師。如果桌面程序指的是win32平台的開發,我看這個市場現在小得可憐。如果遊戲也不算的話,那恐怕就更少人了。所以如果能寫桌面應用的人還是很牛逼和稀少的。不過如果桌面是指任何有ui的程序,藉助web做view不是什麼很難的事情,在後台運行個什麼服務也不是很難的事情,和這樣的事情比,還是做自己希望的事情更有意義。這裡的假設似乎是會寫桌面程序的人比較牛逼,我覺得一定不是這樣。所以牛逼的人和牛逼的人之間有共性,但是沒有可比性。
大公司的程序員工作情況別人已經說了,我不必再說。
想要提高的話:
1. 多動手2. 找個比你懂得多一些的人一起做個小項目3. 關注國際上的conference和新近paper最最重要的是,你有這個寫程序的需求和追求。一般好的創業項目也是基於自身對某個缺失功能的強烈渴望。而玩星際,wow玩到出神入化比寫一個桌面應用有時候難多了。說的好像樓房一個人可以建好似的...
你的 「稍顯複雜的桌面程序」定義太模糊了,我無法回答,很多程序員是被公司養著的,很少主動去學習,沒有多少程序員即喜歡WINFORM同時又有興趣搞WEBFORM,還願意去學習PDA,移動終端的,戰線太長,顧不過來,當然我見過這樣的,平均資歷都有8-10年的樣子,代碼多少行不清楚,跟他們交流,應該不少於10萬行吧,但是都自己單幹去了,一般公司無法容下他們了
樓主,你自己給我做一枚針看看。
CSDN 過來的 路過
嘿嘿,午覺之前在csdn論壇看到這帖子,他引用你的問題
http://bbs.csdn.net/topics/391929151
太困了,只是還記得去年的這個時候我們上編譯原理這門課程的時候,老師和書都說過,即使是精通編譯原理的那些大師,也沒有獨立學過一個完整的編譯器。
想了一下,覺得1.從一個已經可運行、涉及技術方向合適的、 規模合適的有源碼的程序入手很重要。想想對大多數人,可能從這一點開始,可以接觸、並漸漸入門。共勉。
因為大多數人都是又懶又笨,又沒恆心和毅力的人。所以,哪個行業都是一樣的。提高的方法:花5年時間,每天下班把計算機相關的各種技術領域粗通,做到能google解決絕大多數問題的程度,然後看什麼都簡單了
大多數程序員一個人連一個稍過複雜的桌面軟體都做不出來嗎?
不考慮時間問題的話,是可以做出來的,我一個人做了內部的管理系統,包括web客戶端和手機客戶端。
開源的許多桌面軟體也是一個開發者維護的。
在普通的公司里程序員的工作是什麼樣子?
各個公司不同,我的工作是交流、寫文檔、寫代碼、上線、維護、接電話、修復bug、評審、整改,以及和其它部門的員工一樣,催著等著各種款項報銷。
新手怎樣得到提高?
去嘗試各種辦法解決問題。勞其筋骨,餓其體膚,空乏其身,行拂亂其所為,然後才能:「卧槽,原來是這麼回事啊(╯‵□′)╯︵┻━┻!」
如果一切順利說明並沒有前進,只是在隨波逐流。如果步履維艱說明一直未停下,才能夠不斷提高。一個人遇到問題不同,想法也不同。我認為做什麼事自己儘力做好就行啦
我可以,有空答
推薦閱讀:
※微軟10月發布的Surface Phone 配置要逆天了,你是追配置還是要體驗?
※現在計算機科學與技術專業前景如何?
※.net學到最後,到底是學什麼呢?
※為什麼遊戲行業加班如此普遍?
※作為甲方的信息安全負責人是一種什麼樣的體驗?