數(shù)據(jù)科學(xué)與人工智能從業(yè)者如何提升編程能力
大數(shù)據(jù)文摘出品
來(lái)源:medium
編譯:Hippo
我討厭編程!
這是我七年前在實(shí)習(xí)期間告訴同齡人的話。千真萬(wàn)確。我不想像公交上那些面無(wú)表情的人那樣成為沒(méi)有感情的編程機(jī)器。
時(shí)至今日,我已經(jīng)獲得了2個(gè)編程相關(guān)專(zhuān)業(yè)的研究生學(xué)位,先后在5家不同公司中擔(dān)任網(wǎng)絡(luò)開(kāi)發(fā)人員,目前擔(dān)任計(jì)算機(jī)視覺(jué)工程師職位。
我熱愛(ài)編程!
這是我告訴所有問(wèn)我為何如此熱衷技術(shù)的人的話。我對(duì)編程的熱愛(ài)源于這樣一個(gè)認(rèn)識(shí):使用代碼實(shí)現(xiàn)的應(yīng)用確實(shí)為如今這個(gè)技術(shù)驅(qū)動(dòng)的社會(huì)帶來(lái)了機(jī)遇。
本文介紹培養(yǎng)和提高我的編程能力的方法。這里將提供5種可以用來(lái)提高編程技能的策略。
算法練習(xí)
算法常常會(huì)嚇跑很多機(jī)器學(xué)習(xí)從業(yè)者,我自己也不例外。機(jī)器學(xué)習(xí)領(lǐng)域的興起使得通過(guò)啟發(fā)式算法來(lái)檢測(cè)模式的傳統(tǒng)方法不再成為必須,我們將特征檢測(cè)留給了神經(jīng)網(wǎng)絡(luò)。
盡管如此,算法仍在軟件和計(jì)算領(lǐng)域中占有一席之地,并且肯定在機(jī)器學(xué)習(xí)領(lǐng)域中也不可或缺。算法練習(xí)是提高編程技能的利器之一。
除了在提高代碼內(nèi)存效率的靈感方面具有顯而易見(jiàn)的好處,研究算法的另一個(gè) 好處是能很好的培養(yǎng)解決問(wèn)題的思維方式。
用你所選擇的編程語(yǔ)言實(shí)現(xiàn)探索各種數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)修改方法的算法。了解如何利用數(shù)據(jù)對(duì)象、方法和其他有用的函數(shù)提高編程效率。
數(shù)據(jù)科學(xué)家經(jīng)常使用數(shù)據(jù)挖掘和網(wǎng)絡(luò)爬蟲(chóng)算法。充分了解算法和數(shù)據(jù)結(jié)構(gòu)有助于生成高效的代碼,在實(shí)踐中執(zhí)行速度更快,進(jìn)一步減少項(xiàng)目交付時(shí)間。
不同算法的復(fù)雜程度也不盡相同,這里有一個(gè)供你熱身的簡(jiǎn)單算法說(shuō)明。相關(guān)鏈接可以參考這里:
https://towardsdatascience.com/algorithms-for-data-scientists-insertion-sort-6caa69f906b3
個(gè)人經(jīng)驗(yàn):
作為移動(dòng)計(jì)算機(jī)視覺(jué)工程師(Mobile Computer Vision Engineer),我將許多深度學(xué)習(xí)模型用于常見(jiàn)的計(jì)算機(jī)視覺(jué)(CV)任務(wù)中,例如姿勢(shì)評(píng)估、對(duì)象檢測(cè)等。
盡管PyTorch、TensorFlow和Keras等平臺(tái)轉(zhuǎn)移了模型實(shí)現(xiàn)的復(fù)雜性,但我發(fā)現(xiàn)有必要針對(duì)特定用例實(shí)現(xiàn)自定義算法。
例如,創(chuàng)建基于余弦相似度的姿態(tài)匹配算法或有效地遍歷作為機(jī)器學(xué)習(xí)模型輸出的數(shù)據(jù)結(jié)構(gòu)。
為了確保我對(duì)各種算法的風(fēng)險(xiǎn)有足夠的了解,我買(mǎi)了一本很好的教材——《Introduction to Algorithm(第三版)》。不過(guò)這本教材可能對(duì)初學(xué)者并不是特別友好,在這種情況下,特別推薦諸如HackerRank這樣的平臺(tái)。
技術(shù)書(shū)籍
書(shū)本學(xué)習(xí)讓我感到自己回到了校園,沒(méi)有什么能比語(yǔ)言生動(dòng)、內(nèi)容詳實(shí)的書(shū)籍更讓人受益匪淺。
在我職業(yè)生涯的早期,我一直以為自己最終會(huì)停止觀看YouTube教程或是購(gòu)買(mǎi)編程書(shū)籍,因?yàn)槲乙呀?jīng)獲得了“忍者級(jí)”的編程技能。
然而幾年來(lái),我意識(shí)到無(wú)論已經(jīng)到了哪個(gè)程度,都能了解到更多關(guān)于編程語(yǔ)言的知識(shí)。盡管我喜歡通過(guò)YouTube編程教程進(jìn)行學(xué)習(xí),但沒(méi)有什么能取代經(jīng)典編程技術(shù)書(shū)籍中豐富而簡(jiǎn)潔的知識(shí)。
例如,Python對(duì)于數(shù)據(jù)科學(xué)家來(lái)說(shuō)算是一種易于掌握的標(biāo)準(zhǔn)編程語(yǔ)言。經(jīng)過(guò)幾周的語(yǔ)法、數(shù)據(jù)結(jié)構(gòu)和通用函數(shù)的學(xué)習(xí),可以輕松實(shí)現(xiàn)和運(yùn)行自定義python腳本。你可以進(jìn)一步通過(guò)視頻學(xué)習(xí)具備Python的中級(jí)技能。
但是,Python中可以探索的內(nèi)容還有很多,而且都可以提高你的編程技能。我學(xué)習(xí)有關(guān)Python語(yǔ)言的更深入內(nèi)容的方式之一就是通過(guò)技術(shù)書(shū)籍,更具體地說(shuō)是《Fluent Python》。本書(shū)并不適合初學(xué)者使用,而是主要針對(duì)中等以上水平的程序員提高編程熟練程度。
總之,技術(shù)書(shū)籍可以通過(guò)對(duì)編程語(yǔ)言簡(jiǎn)單清晰的介紹來(lái)提高數(shù)據(jù)科學(xué)家的編程水平,也可以通過(guò)對(duì)編程語(yǔ)言的深入闡述,提高數(shù)據(jù)科學(xué)家的現(xiàn)有編程技能。
閱讀其他開(kāi)發(fā)者的代碼
最近,我嘗試實(shí)現(xiàn)深度學(xué)習(xí)卷積神經(jīng)網(wǎng)絡(luò)Inception Network。
盡管我已經(jīng)有利用Python和TensorFlow庫(kù)實(shí)現(xiàn)的方法,但我對(duì)其他機(jī)器學(xué)習(xí)從業(yè)人員如何實(shí)現(xiàn)很是好奇。
我探索性的瀏覽了幾個(gè)GitHub庫(kù),研究了其他開(kāi)發(fā)人員的代碼,毋庸置疑,我學(xué)會(huì)了改進(jìn)已有方案的方法,并且更好的應(yīng)用了我現(xiàn)有的編程技能。
有大量的公共GitHub庫(kù)可供研究和學(xué)習(xí)。你不需要在Google或Facebook之類(lèi)的技術(shù)公司工作就可以向他們的開(kāi)發(fā)人員學(xué)習(xí)。只需瀏覽其工程師開(kāi)發(fā)的項(xiàng)目的公共庫(kù)。對(duì)于數(shù)據(jù)科學(xué)家來(lái)說(shuō),這可能意味著探索諸如最近發(fā)布的Detectron2或其他開(kāi)源機(jī)器學(xué)習(xí)工具之類(lèi)的代碼庫(kù)。
在工作場(chǎng)所的內(nèi)部開(kāi)發(fā)團(tuán)隊(duì)中進(jìn)行代碼審查也是一種合適的學(xué)習(xí)方法。通過(guò)了解其他開(kāi)發(fā)人員實(shí)現(xiàn)方法背后的理由和思路,你可以間接擴(kuò)展自己的視野和編程知識(shí)。
學(xué)習(xí)不同的編程語(yǔ)言
致力于編程語(yǔ)言多樣性是提高編程水平的不二之法。程序員用代碼來(lái)解決問(wèn)題,多種編程語(yǔ)言的知識(shí)擴(kuò)展了可用于解決問(wèn)題的工具。
掌握Python可能會(huì)幫助您學(xué)習(xí)數(shù)據(jù)科學(xué)核心的實(shí)際應(yīng)用。但在專(zhuān)業(yè)和實(shí)踐環(huán)境中,軟件開(kāi)發(fā)包含不同的平臺(tái),每個(gè)平臺(tái)都有用于訪問(wèn)和實(shí)現(xiàn)功能的特定語(yǔ)言。
專(zhuān)業(yè)的機(jī)器學(xué)習(xí)從業(yè)人員可能會(huì)在以下所示的方法中應(yīng)用不同的編程語(yǔ)言:
- JavaScript從互聯(lián)網(wǎng)上抓取數(shù)據(jù)
- SQL修改和查詢(xún)數(shù)據(jù)庫(kù)
- Python實(shí)現(xiàn)算法和機(jī)器學(xué)習(xí)模型
- Swift / Kotlin / Java開(kāi)發(fā)具有集成機(jī)器學(xué)習(xí)模型的移動(dòng)設(shè)備應(yīng)用程序
- 其他工具和方法
一旦您精通某種編程語(yǔ)言,掌握一種新的編程語(yǔ)言會(huì)容易很多。如果您了解常規(guī)的軟件開(kāi)發(fā)范例,例如面向?qū)ο蟮木幊獭⒐δ芫幊痰?,你將更加容易進(jìn)入狀態(tài)。軟件開(kāi)發(fā)范例知識(shí)適用于各種編程語(yǔ)言。
遵守軟件開(kāi)發(fā)原則
擁抱簡(jiǎn)單,避免重復(fù)并提高可讀性。
這些是我多年編程后積累的經(jīng)驗(yàn)。它們聽(tīng)起來(lái)很簡(jiǎn)單,但是大多數(shù)開(kāi)發(fā)人員都沒(méi)有遵守,我自己有時(shí)也會(huì)忘記這些原則。
因此,在軟件工程業(yè)內(nèi),一些準(zhǔn)則被反復(fù)提倡和強(qiáng)制實(shí)施,以確保開(kāi)發(fā)人員進(jìn)行簡(jiǎn)潔有效的軟件開(kāi)發(fā)。一些列出其中的一部分。
(1) KISS原則
去繁就簡(jiǎn)(Keep It Simple Stupid,KISS)在開(kāi)發(fā)軟件時(shí)強(qiáng)調(diào)了簡(jiǎn)潔這個(gè)概念。解決問(wèn)題的方法不必太復(fù)雜,在軟件開(kāi)發(fā)的設(shè)計(jì)和實(shí)現(xiàn)階段采用簡(jiǎn)潔原則可以確保代碼容易理解和便于維護(hù)。
是的,技術(shù)人員往往喜歡炫技,但為了便于閱讀,請(qǐng)保持簡(jiǎn)單 ——美劇you are not MR.Robot |
(2) SOLID原則
Solid原則包含一組旨在確保面向?qū)ο蟮拈_(kāi)發(fā)人員構(gòu)建可復(fù)用、可擴(kuò)展、可維護(hù)和高效的程序的原則。要了解有關(guān)SOLID中涵蓋的原理的使用和實(shí)踐的更多信息,請(qǐng)查看Katerina Trajchevska視頻中的內(nèi)容。
相關(guān)鏈接:https://www.youtube.com/watch?v=rtmFCcjEgEw&ab_channel=LaraconEU
- 單一責(zé)任原則(Single responsibility principle)
- 開(kāi)閉原則(Open-Closed principle)
- 里氏替換原則(Liskov Substitution principle)
- 接口分離原理(Interface segregation principle)
- 依賴(lài)倒置原則(Dependency inversion principle)
(3) DRY原則
不要重復(fù)自己(Don’t Repeat Yourself)。在編寫(xiě)程序時(shí),編寫(xiě)執(zhí)行已有功能的代碼會(huì)浪費(fèi)你的開(kāi)發(fā)時(shí)間。避免重復(fù)的一個(gè)好習(xí)慣是利用項(xiàng)目文件夾中的實(shí)用程序文件。實(shí)用程序文件包含在源代碼中經(jīng)常執(zhí)行的常見(jiàn)任務(wù)。
特別提及
(1) 個(gè)人項(xiàng)目
開(kāi)展個(gè)人項(xiàng)目可以將數(shù)位機(jī)器學(xué)習(xí)從業(yè)者帶入新的領(lǐng)域、庫(kù)、平臺(tái)、框架和編程語(yǔ)言。
開(kāi)展個(gè)人項(xiàng)目來(lái)提高你的編程技能的主要優(yōu)勢(shì)在于開(kāi)發(fā)軟件產(chǎn)品時(shí)會(huì)遇到各種問(wèn)題。編程解決的每個(gè)問(wèn)題都會(huì)增加你的整體技術(shù)水平。
(2) 分享經(jīng)驗(yàn)
教他人如何應(yīng)用你擅長(zhǎng)的語(yǔ)言編寫(xiě)程序是一種行之有效的方法,可以提高編程技能并展示你的專(zhuān)業(yè)知識(shí)。 你可以通過(guò)YouTube視頻、在線課程或我最喜歡的媒體博文等多種方式分享經(jīng)驗(yàn)。
結(jié)論
提升編程技能是一次沒(méi)有終點(diǎn)的旅程。您總是可以在編程方面學(xué)習(xí)或改進(jìn)。
嘗試著享受學(xué)習(xí)過(guò)程。
有時(shí)情況確實(shí)很棘手,StackOverflow可能無(wú)法解決所有問(wèn)題,但請(qǐng)記住磨練你的技巧所花費(fèi)的每一分努力都是最終融會(huì)貫通所必需的。
相關(guān)報(bào)道:
https://towardsdatascience.com/how-to-improve-programming-skills-for-data-scientists-and-machine-learning-practitioners-d865d8aadab1
【本文是51CTO專(zhuān)欄機(jī)構(gòu)大數(shù)據(jù)文摘的原創(chuàng)譯文,微信公眾號(hào)“大數(shù)據(jù)文摘( id: BigDataDigest)”】