做 IT,如何從優秀變為卓越?

為什麼在沒有學習過數據結構的情況下,開發軟體也很輕鬆呢。

兩年前花了一個星期時間看了一本數據結構,吸收的東西就不說了,演算法除了基本的二分法,冒泡排序,其他沒深入過。開發Android應用層軟體起來,依然很輕鬆。

我不是聽說去大公司,就得研究演算法與數據結構的嗎。我們一般的開發者需要深入學習這些嗎?

如何成為一名卓越的開發者?

======更新

第一次有這麼多人關注問題,小激動。希望大家能指點一二。

我知道做遊戲需要演算法很多,做安卓軟體開發呢,我在開發的過程中算的多的地方就是圖片處理方面,除了濾鏡,其他的高中數學就能搞定,所以個人認為一般的安卓軟體,不需要深入學習演算法,歡迎拍磚。


優秀還是卓越跟演算法沒有直接聯繫,我也不認為開發者都應該投入很大的精力在演算法上,這終究還是和做的事有關係。比如我們這邊偏向業務,解決的多是工程上的實際問題,依賴的是技術棧和工程經驗,去深入研究演算法的投入產出比不高;同屬於我們部門的騰訊優圖,其產品主要也是面向移動端,但對他們來說,Android或者iOS只是一層皮而已,核心都是演算法,研究演算法的價值當然很大,所以對演算法的要求自然也非常高。題主的問題比較多,分幾個方面回答:

1. 去大公司就得研究演算法和數據結構?

研究這個詞用的太重,大公司大部分崗位對演算法的要求也並不高。我不是科班出身,讀書時雖然做了很多演算法方面的工作,但主要是在Neural Network方面,跟傳統意義上CS的演算法差別很大。找工作之前翻完了演算法導論、編程之美,寫白板刷LeetCode,在真正開始找工作的時候倒也沒有在演算法上吃很大的虧。我相信稍微有點經驗的程序員都不會輕視演算法的重要性,演算法對於大部分程序員來說,應該是其知識體系的一部分,但沒有必要刻意誇大一般面試演算法的難度,也沒有必要刻意拔高演算法的重要性。我們這邊在面試的時候,也更傾向於把演算法當作作為一種基礎能力考察,而並不是一味深究。我自己在面騰訊的時候寫了4道白板,都是常用的演算法和數據結構,但真的要說難度,並不高。

2. 開發Android應用軟體很輕鬆?

這是一道送分題。

3. 如何成為卓越的開發者?

卓越的開發者標準很多,但我個人的總結,在技術上最終就是一點:可靠。回身看看你的身邊,什麼樣開發者能讓你覺得可靠?

高效的產出高質量代碼,迅速解決開發中存在的BUG,對於需求提出合理的解決方案,領導解決困難的問題。

但要做到可靠談何容易!這依賴的是你不斷高質量的完成最核心的需求,解決別人解決不了的BUG;依賴的是你每次都能提出最合理的解決方案,讓大家少走彎路;依賴的是面對一個所有人都未知的領域,你能抽絲剝繭,帶領大家攻堅;依賴的是在發生事故時,有你在就一定能力挽狂瀾,把損失降到最低。那能做到這些的背後是什麼?是紮實的技術棧,是對整個項目完全的理解,是超強的執行力、判斷力和溝通能力。如果在你的團隊中,大家都覺得你是一個可靠的人,那我相信你一定也是一個卓越的人。

希望我能成為一個可靠的開發者。

PS:

這是我的值乎主頁:

hi/people/723258443514810368

關於互聯網,移動開發,程序員,學習方法,職業規劃方面的問題,歡迎交流。我回答一個問題的時間平均要20~30分鐘,上周太忙,有些朋友的問題沒有來得及回答,在此說聲抱歉。


踏實學習實用知識,不玩高科技。

關注產品與運營需求,主動和產品、設計、運營同學探討更高效簡潔的實現方式。有機會接觸用戶一定不要吝惜熱情,主動了解他們的痛處。

怎樣實現更穩定不容易出錯?怎樣實現app速度更快?內存能否省一點?怎樣實現用戶更容易理解?怎樣實現可以讓運營同學更快實現運營目的?上運營活動怎樣做到盡量少發版本?安裝包是否可以更小一點?

連接時間是否可以更快一點?流量是否可以更省一點?動畫是否可以更流暢更自然?怎樣減少用戶輸入同時還保持功能完整?

怎樣監控註冊轉化率?怎樣識別渠道刷量?怎樣提高支付轉化率?怎樣實現垃圾消息過濾?

是的,我一點技術都沒提,也沒有說什麼演算法數據結構。

就是一堆雞毛蒜皮的問題,而且這種問題還可以不停羅列下去。也許你會覺得很煩,很枯燥……但是,事實就是這樣,做產品沒有捷徑。

扎紮實實滿足用戶需求,老老實實解決用戶問題,就這樣。

再有時間就折騰手機,玩各類app。

想會做,先會玩。


需求,深刻理解需求

代碼,深刻精練代碼

產品,深刻把握產品

商業,深刻挑戰商業


安卓app不太清楚,但遊戲行業里經常有以下需求:

  1. 上萬封郵件,怎麼自動快速刪除已經過期失效的郵件。
  2. 全服郵件該如何設計?如何防止玩家重複領取全服郵件獎勵?
  3. 計算某個不怎麼變化的動態屬性數值很費時間,需要跨表查詢,500ms以上了)怎麼改進在1ms內?
  4. 玩家背包需要快速標記玩家查看過的新獲得的物品,當前的設計是一個物品佔用一個背包欄里一個對象,需要遍歷,怎麼改進?而且背包佔用的內存空間過大,應該怎麼精簡?
  5. 玩家技能、關卡、稱號、成就解鎖需要各種條件。該如何設計數據結構,檢查和更新都得在1ms內完成。
  6. 玩家抽獎必須是200次之內肯定出某些特定禮物,該如何設計數據結構、演算法,並驗證正確性?
  7. 全服玩家的抽獎分布必須符合正態,如何設計?

這些都是實實在在工作中遇到的,不熟悉數據結構和演算法的人經常做的效率不高,占的空間還特別大。樓主如果還沒碰到,那隻能說明你業務還沒有需要這些東西。

----------更個答案,歡迎帶著代碼噴,畢竟我也是菜鳥--------

  1. 按時間排序,二分
  2. 用bloom filter記錄玩家領取全服郵件的uid
  3. 既然是遍歷所有屬性,自然是按模塊計算,分別存儲,最終冗餘地存放,空間換時間。
  4. 按物品id做前綴樹(因為設計里就不允許玩家自己排列物品欄的東西)
  5. 有向無環圖(DAG)+ 拓撲排序(Topological sorting)
  6. 隨機種子/梅森旋轉(MT)
  7. 同上,但是用的是輪盤賭演算法

是這樣的

知乎上有一種趨向,就是迷信學歷,迷信演算法,這是知乎主流程序員的一種自我保護,下意識的用這種辦法來和普通開發者拉開距離。

要我說,還是那句話「沒碼你說個丁日!」

程序員最重要的是出成果,讓你幹啥你都能搞定,就是好程序員,我不管你是自己開發演算法還是找的庫。

程序員最重要的能力是快速學習能力,這裡就要說了,如果你真的不懂一點演算法,學起來,有點費勁,這個時候,不懂演算法,你就會自動避讓一些和演算法相關的內容,久而久之,你會發現你不會的東西越來越多,想要學下去越來越難,大部分人在這個階段就所謂的代碼寫久了,要轉管理了。


謝邀。樓主你應該知道,公司都是業務驅動的。我是做DBA的,公司一點點小小的業務量,前陣子有人說要上中間件對資料庫進行分表,我說你在搞笑嗎?以現在的業務發展速度,再過5年也不需要分表。OK,回到樓主的話題,如果一個很爛的軟體就能滿足客戶要求,滿足業務要求,領導也沒說啥,那你在這個公司再去精益求精就沒有多大價值了。


一個卓越的IT人最重要的一點就是尊重用戶,不該要的許可權別要,不該收集的數據別收集,不該駐留的別駐留。總結起來就是別耍流氓。然後才能談技術能力。


私以為,程序員大多不會稱呼自己是搞IT的,因為在他們的印象里搞IT是指修電腦,而只有外行才會稱呼程序員是搞IT的。


能寫出容易維護的代碼就算優秀了。

卓越的開發者應該是主動承擔開發任務,推動開發進度的人。


現在的年輕人啊,太naive,你認為演算法和數據結構沒有,那是因為你只會寫寫hello world,用用別人的api,編程的大門都沒邁進,充其量只是在門前掃掃地而已。

安卓應用用不上演算法?隨便一個應用,用戶量上去了,數據量大了,性能永遠是瓶頸。

舉個簡單的例子,你寫一個手機通訊錄的app,搜索聯繫人用不用演算法?要是用戶有上千個聯繫人,說不定你的程序直接卡退了。


這取決於你想做應用開發工程師還是計算機科學家


瀉藥,贊同樓上的說法,說的很細緻,佩服樓上那麼好的記憶力,我是看完就忘了!

先說我對於程序員的定義:知其然知其所以然,現在所有的技術還是基於數據結構、演算法、計算機系統、計算機網路等基礎知識,我是非科班出生這些略看一二。

至於優秀到卓越,我還沒達到,我不能妄議。我介紹幾個我人為的好習慣:

1、寫博客,把業務上用到的功能,使用方法寫出來,調用到底層類包,了解一下包內的實現方式和當時大神的想法,也一併記錄下來。

2、從抽象層面,了解一個技術棧,理性認識到自己所做的位置,看看哪裡還能有突破,並且去突破自我。

3、多自己實現一些技術演算法,看看效率和大神的有多大區別~

4、多上github裡面大神多,多看一些他們寫的代碼


找出你身邊高半個級別,你認為最優秀的人學習,一步步來,學習他,超越他,然後再找下一位,一直下去,你就會成為卓越。


1.能夠獨立思考

2.能夠系統思考

3.能夠思考如何思考


這主要取決於你是否是一個牛逼的人。

智力:你要相信人是有智力差距的,並且不同的人差距有可能是天與地。寫代碼是需要思考的,代碼只是你思維的外在體現。智力不同表現在學習能力上也有所不同,他影響你的成長速度和成長高度。

勤奮:不管你多聰明,如果你不學,你的大腦就像一台沒有軟體的電腦。勤奮是可以通過毅力改變的,不像智力定型以後難以提升。勤奮和智力哪個重要要看哪個是你的短板,當然,一般人都不願承認自己智力不如人。(-_-)

知識儲備:前兩者在過去時間內對你產生的影響。不僅僅是計算機方面的知識,還包括其它學科的知識,例如數學、英語甚至哲學、生活經驗。還有解決問題的經驗,也算是一種知識。

除了個人因素還有外部因素,你的老師是否牛逼,你的同學是否牛逼,你的同事是否牛逼,你的團隊對待代碼的態度。。。

至於數據結構、演算法這些東西,牛逼的人順便就學了。學了未必會牛逼,不學你肯定不敢稱牛逼。

至於學習過程、學習方法、書籍資料我就不講了,用你的智商自己去尋找。各人有各路,別人講的未必適合你。


我們不寫代碼,我們只是代碼的搬運工


比起卓越,我想還是先從變得靠譜開始吧

up!(??ω??)?


JUST DO IT!


保持好奇心


Talk is cheap, show me the code!


推薦閱讀:

能幫助通俗解釋下NSGA3演算法嗎。?
學習機器學習深度學習之後,還需要掌握傳統演算法和數據結構嗎?

TAG:演算法 | Android開發 | IT行業 | Android | 演算法與數據結構 |