對程序員們來講挑戰自我很是重要,要麼不斷創新,要麼技術停滯不前。新年伊始,我整理了12個月的目標,每一個目標都是對技術或我的能力的挑戰,並且能夠年復一年循環使用。html
01. 變得有耐心linux
02. 保持健康程序員
03. 擁抱變化帶來的不適應正則表達式
04. 學習一門新的編程語言算法
05. 自動化shell
06. 學習更多數學知識編程
07. 關注安全小程序
08. 備份你的數據vim
09. 學習更多理論知識安全
10. 接觸藝術和人文
11. 向新的軟件學習
12. 完成一個本身的項目
接下來我會對這些建議逐個介紹。
變得有耐心
程序員們會擔憂鍛鍊耐心付出的努力得不到應有的回報。其實,培養耐心只要付出很小的投入就可以獲得相對而言很大的收穫。下面是開始鍛鍊耐心能夠嘗試的一個列表,只要全身心投入其中任意一項,均可以在一個月左右脫離門外漢(成爲有經驗的新手)的階段:
烹飪、徒步、滑雪、天文、慢跑、木工、武術、舞蹈
保持健康
程序員一般久坐少動,所以在平常工做中會面臨健康問題,但一般都被咱們忽略了。一年中花整整一個月來調整你的生活習慣、飲食和生活環境,這會促使你養成持久、健康的生活習慣。每一年去一趟診所檢查血壓、膽固醇和血糖,看看這些指標最近有什麼變化。若是你的手腕開始疼痛或者已經疼了好久,立刻停掉手上的工做開始與「鼠標手」(重複性勞損)做戰。注意你的坐姿,尤爲是肩膀和脖子。我使用了矯姿器來幫助治療。
跟蹤你的體重、攝入以及燃燒的卡路里。若是有必要,能夠改變生活方式以養成健康的飲食習慣和減肥。
擁抱變化帶來的不適
在我20剛出頭的時候,經過觀察身邊年紀稍大一些的夥伴我發現有些人停滯不前而另外一些則活力充沛,我試着尋找背後的緣由。答案就是溫馨感。溫馨會讓技術停滯不前。當找到一個可以爲我所用的系統時,咱們會一直使用它。但技術是不斷進步的,而那些停留在溫馨區的人永遠不會意識到這些進步可以爲他們帶來好處。不破不立,要讓本身適應不溫馨的感受。
下面列出的事情一開始可能會讓你感到不適應:
在一個月的嘗試以後,你能夠決定是否繼續採用新方式,或者找到新方式中好的經驗與原有方式的結合點。例如,在我從使用了10年的emacs轉向vim時,我會爲插入模式設置emacs風格快捷鍵從而繼續使用vim。
學習一門新的編程語言
編程語言起起落落。若是隻瞭解一門語言,程序員的解決問題能力以及職業前景都會所以受到限制。花上整整一個月時間吸取一門新語言或者一個新的編程範式,並用它寫一個小程序。
下面是一些能夠學習但不是很是主流的編程語言:
Racket、 Haskell、Scala、Erlang、Clojure、SML/NJOCaml、Squeak、Prolog、Datalog.
若是你無所不知,那麼你能夠實現一門新的編程語言。
自動化
程序員擁有最強大的待開發技能就是將虛擬和現實自動化的能力。若是你歷來沒有造過一個機器人,那麼去作一個吧。至少學會使用Lego Mindstorms或者玩一玩 Arduino board。
檢查一下你天天的任務,看看其中有哪些能夠徹底或者部分自動化。自動化在家庭生活裏已經有了長足的進步,甚至能夠像Insteon那樣對系統進行DIY。
投資一個月的時間來進行自動化:
譯註:
procmail:procmail軟件包包含一個自動的郵件管理器,能夠很好的過濾和排序郵件。
cron:linux下的定時執行工具。
Roomba:Roomba是iRobo公司生產的定時智能機器人。
學習更多數學知識
計算機科學本質上講是數學的一個學科。好的數學家中間會產出優秀的程序員。不要讓你的數學能力喪失殆盡。
考慮每一年花一個月時間複習列表中的一項:
邏輯學、離散數學、微積分、機率論、統計學、抽象代數、數論、範疇論、偏序理論
關注安全
不多有程序員具有好的安全習慣。若是你對本身的數字安全很在乎,你就會對你寫的代碼安全性更加關心。確保你在每一個站點都使用了惟一的高安全係數密碼。使用加密的密碼管理器來管理你的密碼,例如PasswordSafe或者KeePassX。若是你尚未對整個磁盤加密,留出時間完成它。(在Mac上能夠輕鬆完成)
每一年都要研究過去12個月中前10位的安全漏洞。他們是如何發生的?在編程中須要怎麼作可以避免在你的代碼中出現這些漏洞?
下面是另一些你須要嘗試的安全任務:
譯註:
nmap:linux下的網絡掃描和嗅探工具包
備份你的數據
每一年花一些時間檢查你的備份策略。
花一個月時間將備份花費的時間減到最小。
使用基於雲的備份服務,好比Mozy和Carbonite,很容易創建無縫自動備份。
更全面地防護能夠選擇爲每一個人分發硬盤,對每臺電腦使用像Time Machine這樣的自動備份工具進行備份。
對重要文件使用異地遠程倉庫進行版本控制。
學習更多理論知識
計算機科學有豐富的理論基礎。
瞭解最新進展的同時還要增強對經典開發理論的掌握。
譯註:
形式語言:按必定規律構成的句子或符號串的有限或無限的集合。
自動機:是有線狀態機(FSM)的數學模型。
可計算性理論:研究計算的可行性和函數算法的理論。又稱算法理論。它是算法設計與分析的基礎,也是計算機科學的理論基礎。
計算複雜性理論:計算複雜性理論是理論計算機科學的分支學科,使用數學方法對計算中所需的各類資源的耗費做定量的分析,並研究各種問題之間在計算複雜程度上的相互關係和基本性質,是算法分析的理論基礎。
形式化方法:在邏輯科學中是指分析、研究思惟形式結構的方法。
語義學:研究天然語言中詞語意義的學科。也能夠指對邏輯形式系統中符號解釋的研究。
對於剛起步的程序員,能夠先看一看下列文章:
譯註:
CEK:CEK機器是由Matthias Felleisen和Dan Friedman開發的λ-演算的力學模型。
Haskell:一種純函數式編程語言,以美國數學家Haskell Brooks Curry命名。
接觸藝術和人文
工程師每每輕視藝術。他們沒有意識到藝術和人文是基礎昇華的重要因素。史蒂夫·喬布斯樂於指出將技術與人文結合的重要性,事實也倒是如此。
藝術和設計原則一樣適用於人和計算機之間的交互。不要忽視這些原則。藝術和人文的訓練讓直覺更加敏銳,而這方面的練習是難以用數字來計量。工程師須要知道如何衡量那些他們不能計量的事物,而不是隻是統計他們能夠計量的內容。
每一年至少有一個月學習下面列出的主題:
社會科學一樣會對計算機科學家有很大幫助,尤爲是經濟學和哲學。
向新的軟件學習
一個爲本身的軟件尋找靈感的好辦法就是向新的或新型應用程序學習。例如,若是你歷來沒有嘗試過3D建模軟件,能夠嘗試Blender。抑或是,若是你歷來沒有接觸過LaTeX,請真誠地試着去了解它。
在學習過程當中,請注意你喜歡什麼和討厭什麼。真誠地問本身,這些觀察到的內容是否在你的軟件中存在。在工做中很難看到本身的缺點,但發現別人的不足卻很容易。天下沒有哪一個父母認爲本身的孩子長得難看。請學習看到本身做品的不足。
完成一個本身的項目
若是你成天爲別人寫代碼,那麼爲本身寫程序能讓你記得當初爲何會成爲程序員。每一年爲本身選擇的項目分配一個月的時間,完成核心功能,將其開源發佈。