從小開始學(xué)編程的小姐姐自述:我變成更好程序員的三點(diǎn)心得體會(huì)
本文經(jīng)AI新媒體量子位(公眾號(hào)ID:QbitAI)授權(quán)轉(zhuǎn)載,轉(zhuǎn)載請聯(lián)系出處。
編者按:最近,國外一名小姐姐分享了自己的編程學(xué)習(xí)經(jīng)驗(yàn),引起了不少關(guān)注。她名為Keri Savoca,小時(shí)候就學(xué)了HTML并開發(fā)了網(wǎng)站。之后又學(xué)習(xí)了SQL語言以及JavaScript和Ruby等。在這個(gè)過程中,她也積累了不少感悟與經(jīng)驗(yàn),并分享了出來。有人閱讀了之后稱,文章里面的確有比較扎實(shí)的干貨。希望能夠給你帶來啟發(fā)。

編程并不是要你告訴計(jì)算機(jī)做某事
很多人都以為,編程就是要告訴計(jì)算機(jī)去做某事,就只需要編寫一個(gè)命令,就像 do X一樣,問題就解決了。
這其實(shí)是一個(gè)很大的誤解,編程需要的不是do X,而是:
- Do X to Y
- Get X from Y
- Get X from Y, and put it in Z
- Create X in Y
- Create X in Y, and make it do Z
等等。
只有開始寫代碼來解決實(shí)際問題,才能意識(shí)到這一點(diǎn)。
比如說,從BigQuery 中提取一組數(shù)據(jù),并將其連接到Data Studio中做條形圖。
一般情況下,可以通過點(diǎn)擊按鈕對X軸上的參數(shù)進(jìn)行升序或降序排序,但你想要根據(jù)BigQuery中的維度進(jìn)行自定義排序的手,就需要代碼來解決這個(gè)問題了。
假設(shè)想要完成的X軸上的排序順序是:A, D, E, B, C, F,排序順序與其在“table001”中“location”維度有關(guān)系,可以這樣解決:
- ELECT *,
- CASE
- WHEN location = ‘A’ then 1
- WHEN location = ‘D’ then 2
- WHEN location = ‘E’ then 3
- WHEN location = ‘B’ then 4
- WHEN location = ‘C’ then 5
- WHEN location = ‘F’ then 6
- ELSE 0
- END as SortOrder
- FROM
- table001
現(xiàn)在可以根據(jù) SortOrder 進(jìn)行排序,這是自定義的,而不是升序或降序。
這就是所謂的do X,但編程遠(yuǎn)遠(yuǎn)沒有結(jié)束。因?yàn)檫@些只存在于控制臺(tái)中,而沒有實(shí)際應(yīng)用。
編程到這個(gè)階段,才剛剛完成了一半。
這聽起來像是一個(gè)常識(shí),但對于剛開始編程的人來說,可能需要過一段時(shí)間才能夠在概念上有所理解與體會(huì)。
寫代碼是為了解決問題,不要太依賴教程
但根據(jù)說明性教程學(xué)習(xí)編程的時(shí)候,卻很難學(xué)到這一點(diǎn)。
因?yàn)槟悴皇窃谡嬲鉀Q一個(gè)問題,而是在遵循一系列的指令。
當(dāng)你正確的遵循這些指令的時(shí)候,就會(huì)產(chǎn)生一個(gè)特定的結(jié)果。
但如果你要去解決一個(gè)尚未解決的問題時(shí)呢?就沒有任何指令可以遵循了。
在學(xué)習(xí)編程的時(shí)候要注意到,學(xué)習(xí)到的技能應(yīng)該是可以轉(zhuǎn)換的。如果你不能把你練習(xí)的技能應(yīng)用到不同的場景中,跟著教程學(xué)習(xí)就沒有意義。
基于這方面考慮,上面的示例應(yīng)該要加上because這個(gè)詞:
- Do X to Y because …
- Get X from Y because …
- Get X from Y, and put it in Z because …
- Create X in Y because …
- Create X in Y, and make it do Z because …
當(dāng)你學(xué)會(huì)了制作一個(gè)待辦事項(xiàng)列表應(yīng)用程序的時(shí)候,你應(yīng)該學(xué)到的是,如何使用相同的概念來使應(yīng)用程序以類似的方式運(yùn)行。
多試試偽代碼,可以提升算法思維
當(dāng)寫出來的代碼沒法運(yùn)行的時(shí)候,你要怎么做?
很多人的方式是試錯(cuò),嘗試不同的方法來解決問題。
結(jié)果無非兩種:要么終于起作用了,要么不起作用。
這并不是在于對編程語言缺乏理解,而是算法思維上的問題。
比如你想寫一段代碼,從Y那里得到X,然后放到Z里面。
卻發(fā)現(xiàn)不知道從哪里得到了Z,然后試著把它放到了X中。
該怎么辦?只是試錯(cuò)可能解決問題,但很難知道到底哪里錯(cuò)了。
一種英國學(xué)校學(xué)生經(jīng)常玩的游戲“FizzBuzz問題”通常被用來當(dāng)做編程面試中的題目,也可以作為練習(xí)“偽代碼”的測試:
寫一個(gè)程序打印1到100這些數(shù)字。但是遇到數(shù)字為3的倍數(shù)的時(shí)候,打印“Fizz”替代數(shù)字,5的倍數(shù)用“Buzz”代替,既是3的倍數(shù)又是5的倍數(shù)打印“FizzBuzz”。

技術(shù)博主聞波(webary)在過去的一篇博文中說,就這樣的一個(gè)小問題,很多優(yōu)秀程序員順手就能寫出來方式,但很多計(jì)算機(jī)專業(yè)的畢業(yè)生都不會(huì)做或者花費(fèi)更多的時(shí)間去做。
背后的原因,就是忽略了如何想出解決問題的辦法,而是一上來就想代碼實(shí)現(xiàn)的問題。
而偽代碼是一個(gè)比較好的方式,會(huì)引導(dǎo)你從算法開始思考。
這不需要你去考慮用什么語言來解決問題,而是先想出解決問題的辦法。
原文鏈接:
https://medium.com/better-programming/the-3-realizations-that-made-me-a-better-programmer-af7d1bcab4d3
簡單卻又復(fù)雜的FizzBuzz面試編程問題
https://www.cnblogs.com/webary/p/6507413.html