請問有什麼計科學生可以努力去嘗試的實驗和項目呢?
本人是一名弱校大一計科學生,對未來很迷茫,並且老師教的不是很好,大部分時間在圖書館自學,我現在自學能力還行吧。雖然知道書上學的東西一定有其用處,能懂。但是仍然覺得有些空洞,感覺不是自己學到的知識。很多大牛都說重實操,所以希望諸位大牛能告訴我,有那些我可以跳一跳能做到的實踐性較強的事情。(舉一例:俄羅斯方塊遊戲的製作,簡單的操作系統。我知道我現在根本不可能完成這兩個任務,僅舉例。我現在就是想問可以干那些實踐性強的事情,我想在實踐性操作中去去發現自己未知的理論知識提升自己的專業素養和提高自己解決問題的能力。
同非重點計算機專業畢業,畢業8年,計算機行業從業。
如果讓我回到大一,我會這麼安排。1. 買台電腦,學會安裝使用Linux,你可以使用虛擬機裝一個。推薦 Ubuntu ,因為社區成熟,學習 bash 和各種命令行命令。學會使用vim。2. 學習C語言,c programming language,Linux 編譯。3. 學習 Unix programming environment 這本書,在Linux環境下實踐,學會使用版本控制工具git,將代碼記錄在GitHub上,搞清楚Linux下編譯是怎麼回事,學會使用make文件。
4. 進一步 學習APUE 實踐方法同上。5. 進一步 Unix網路編程兩卷 實踐方法同上。6.讀一讀 code complete。7. 讀一讀ESR的homepage:http://www.catb.org 。裡面信息量非常大,關於黑客的來源和歷史,關於如何成為編程大師。還有他的書Unix編程藝術,大教堂與集市。8.讀一下黑客與畫家。9.前面你都完成了,可以看Linux代碼了。10.學習網路的整體概況,有本書叫計算機網路 自頂向下的方法。不需要精通,能了解大概就好,最好讀英文版。11. 了解瀏覽器裡面的工具是怎麼呈現的,了解w3c,知道HTML,CSS,Js是怎麼回事,會使用瀏覽器的調試工具。12. 深入學習下TCP IP,學會使用一些常用命令行查看相關狀態,學習怎麼抓包,學會用工具分析包。13.深入學習下HTTP協議,讀一下相關的 RFC如鑒權相關的,建一個HTTP server,知道怎麼用工具查看HTTP數據。
14. 嘗試下lamp或類似的組合,寫點有趣的東西。15.到此你可能已經了解了計算機的一些基礎,認真選擇一個平台或領域,向縱深發展。比如:Android平台。16.加兩個國內比較好的技術相關博客,cool shell 和阮一峰的博客,裡面有給你啟發的東西。說一下理由:先博而後淵,先全面了解基礎然後選擇一個領域持續發展。才剛剛大一,不如先去見識一下更大的計算機世界。 學完C,正好去看看C++,如果太難了,去看看Python。除了命令式(imperative)語言,還有函數式編程(FP)語言,去看看Lisp,Haskell,還有結合OO(面向對象)與FP的Scala。 Web開發,前端,後端。前端Javascript,HTML,CSS三大件試一試,後端Node.js,Java或者Python伺服器搭一搭。(現在AWS送免費一年全套服務體驗,真正把東西部署到生產環境中。) 還有時髦的機器學習。聽起來很高大上,我們不如就從身邊搞起。聽說微博有好多美膩的妹紙圖片,一看就想收藏,但是我一張一張點大圖收藏好麻煩。可以這樣,查看網頁源代碼,加上F12,找到圖片鏈接規律,然後正則表達式提取,下載,保存。小圖鏈接與大圖鏈接好像就一點不一樣,替換一下,小圖就變成大圖了。下載完一看,這個妹紙還是個偶像宅,圖片里好多騙錢大師,可是我就想要三次元妹紙。這時候找個機器學習庫,上圖像分類演算法,分離動漫圖片,一切OK。
數據採集(HTTP、文件IO)-&> 數據清理(正則表達式、DFS、BFS)-&> 數據分析(機器學習),這些是不是都涉及了一點呢。
我相信大學時期,這兩點非常重要。一、見識一下外面精彩的世界,從學校、書本中走出來;二、發現這些精彩背後本質的東西,然後安下心來,回到書本,好好學習。 讓興趣與激情推動你去學習,學習那些你覺得真正重要的東西。很幸運,我們學的是計算機科學,完全可以這樣做。 在下也才大三,希望這點人生的經驗能幫助你,希望大家批評指正。這答案下一定會出現「寫編譯器約架」「寫操作系統約架」「寫遊戲引擎約架」的答案。
整個cs範圍那麼廣,你們煩不煩啊,就知道三個小玩意兒整天招搖過市還搞成攀比標準。
你寫個TCP棧,寫個kvm實現,用FPGA做個八級流水線CPU,寫個load balancer,寫個distributed cache,寫個古董MapReduce框架,寫個webserver,寫點xgboost實現,寫點scala的spark應用,寫點剛體物理解算,寫點布料模擬,哪怕寫個malloc,寫點什麼不好啊?這麼多好玩的可以寫為什麼一定要把腦子就擠在那三個東西上然後比來比去?最好學一個C,C++,Objective-C的語言,然後再學一個python什麼的。
關於語言,這個可能是個容易引起爭論和打架的問題。我覺得寫python和寫前端是很適合培養興趣的兩個途徑,但不適合入門。我第一門語言學的是python一直都沒學好,覺得一直在面對過程和庫寫。C系列的語言的指針內存之類的不是說用Python和java不能理解,但是我覺得這個東西還是不太容易,因為你看不到。我覺得比如強引用,弱引用,引用環,內存分配回收是在計算機基礎中很重要的,不過可能用Python,java之類不一定太好理解,這個不是學python能解決的。C,C++,Objective-C是很適合理解語言的很多細節的語言。我覺得比較重要的是學習曲線和語言的封裝。我覺得C和C++一直也沒找到什麼好的上手的項目,C很難寫出有意義的界面或者很大的東西,可能用C++寫cocos2dx也是不錯的入門選擇,圖形界面其實是學習過程中很重要的一個東西,你看不到你可能就沒興趣學下去。我覺得Objective-C很適合做為一門入門語言,他也兼容C和C++你也可以通過Objective-C理解很多C系列的東西。PS:iOS入坑需謹慎,現在競爭也比較激烈
------------------------------------------------------------------------------------------------------------
以下我自己基本都做過,有啥問題可以討論也,覺得不錯給個贊我繼續展開細寫。
1. 基礎知識http://lintcode.com
這個是我大三找工作的時候比較後悔之前沒刷的2. web伺服器用socket實現語言自選(我用的c++,python)
一個用戶的 多個進程的 多線程的可以寫個帶心跳的伺服器,如何保持長連接,上面那個web不用心跳,立即返回數據的
4. 寫一個個人博客語言看心情,我是學的python,php,node,java啥也行
客戶端技術
5. 記事本安卓或iOS的利用sqlite存儲的記事本,然後用http上傳下載實現備份。
6. 新聞客戶端安卓或iOS的新聞客戶端,新聞格式用json或xml,最好自己寫一個新聞的網站,為這個網站做個客戶端,實在不行就用百度或網易的新聞的api,新聞支持文字,圖片,視頻,便於理解json,非同步載入,播放視頻什麼的。
7.即時聊天
搭一個openfire寫一個客戶端,xmpp還是比較常見的一個東西。
8.白板做一個兩端客戶都可以畫的白板,自己寫客戶端加服務端,之前實習在做這個,後面就沒做
9.docker
推薦做啥的都學個docker,比如你寫app需要個什麼服務,自己老搭起來費勁,熟練搭docker必備技能
謝謝邀請。
2013 年寫給開源社區的文章就跟題主的話題很契合,題目是:為什麼 CS 的同學要學習 Linux 開源技術,http://tinylab.org/why-computer-students-learn-linux-open-source-technologies/ 。本文較為全面而簡約地介紹了如何用 Linux 相關技術來做各類基礎課程實驗以及做其他研究,達成技能的提升以及思維的突破。
而最近,答主基於 Docker 構建的極簡實驗環境框架基本成型: http://tinylab.org/how-to-deploy-cloud-labs/ ,也完成了 Linux,Linux 0.11,彙編,C 等幾個實驗環境:http://tinylab.org/projects/
最後來點針對題主的更具體的建議。
在實驗方面,建議確實上機完成配套課程後面的實驗,針對核心課程配合一門以上的經典國外開放課程同步學習和實驗,實驗環境可充分借用免費的開放源碼,很自然地是 Linux + 各類開源軟體,可以知其然還知其所以然。
在項目方面,自主或協同從頭開發一個小型綜合性項目很有必要,類似答主本科搞了四年的 FTP 搜索引擎(從 VB+Access+ASP 到 C+MySQL+PHP)其實是一個不錯的例子,可以進一步實踐很多課程,並把這些課程串起來,從而對 CS 形成更為系統的認知,也能夠實操軟體工程和項目管理的很多方面,還可以培養協作意識、分析思維、歸納能力等等。才大一,去學數學和數據結構吧!花兩個月把離散數學啃了,剩下時間去看數據結構吧。看完了,上leetcode,爭取本科階段刷他個三四遍。以上是說演算法方面的事,這個東西就跟白飯一樣,每天都要吃的。
然後你到了大二,應該要學一些計算機原理之類的東西,比如彙編,機組,os…,說實話這些東西主要做驗證性實驗,就是書上說是這麼個東西,你去做一下證實確實是這麼個東西就夠了。不用寫太多代碼,重在理解原理。比如x86彙編能寫個自己的除0中斷差不多了,有些學校開了介面技術,我個人覺得要是不做硬體,沒太多必要死磕這門課,落伍了的知識。機組照著實驗指南搞出個單周期的CPU,能在理論上理解流水線技術和數據相關,結構相關,分支預測,能在寫高級代碼的時候有意識的想到提高機器指令的並行度,大概就是有意識的減少代碼的數據相關,有意識避免分支,因為學過機組和體系結構就會知道現代cpu有多牛逼,比如同時執行上百條指令,但是這種cpu的能力也是需要程序員來配合的!知道計算機的核心思想之一就是cache,所以得盡量寫出cache友好的代碼,這樣本科階段的機組就到位了,或者能用代碼模擬cache的運行情況,或者用代碼測試出cache的大小都是可以的。os也別指望真能寫出個os,我現在在一個中流的985cs,一個年級誰敢說自己把0.11的Linux內核理解透徹了?內核不是那麼好寫的,挑幾個重點地方看下源碼,試著看能不能改進一下就非常好了。還有編譯原理,不說你學得特別好,起碼得知道編譯器能幹嘛,就是指編譯器聰明在哪裡,傻在哪裡,不要寫讓編譯器為難的代碼。以上是原理部分。大三還有門計網,課程設計是做一個FTP下載伺服器吧。這個算是本科階段代碼量最大的了,每天狂翻apue。。。。感覺好痛苦其實計科本科真的不用那麼多花哨的項目,做好演算法,理解好原理。大的東西以後有的是時間做,有不少人說寫俄羅斯方塊,我覺得寫這個還不如去背幾個經典的代碼段。好多人畢業了連快排,dfs,bfs都寫不出來。。。。。好了,我說點實際的吧,問出這問題的題主,我不認為那些什麼一上來就讓寫編譯器、寫操作系統、寫圖形引擎之類的建議是好建議。
我的看法是從目的出發,更具體一點是從你的就業目標出發。
就業就必然要考慮市場因素。現在的市場主要被 Web開發 統治,所以我的建議是題主可以先選擇一門適合 Web開發 的語言——比如 Python、PHP、Ruby 或者 JavaScript,先隨便找一本講基礎語法的書,不管多爛,捏著鼻子看完,寫寫課後小練習。到這一步,你基本上算是入門了一門編程語言。
然後選一個這門語言比較常用或者熱門的框架,比如
Python 的 Flask / Django,PHP 的 YII / ThinkPHP,Ruby 的 Rails,JavaScript 就是
Node.js。開始仿寫一個網站,比如一個博客系統,todo
list,或者知乎什麼的,只要核心功能就好。比如用戶系統,內容的發布(增)刪除(刪)修改(改)檢索(查)。這個階段不要追求頁面多好看,先努力寫功能。資料庫的話要麼你就用sqlite,要麼就直接寫到文本文件,否則你將會在這個地方浪費海量的寶貴時間。
聽起來非常快糙猛亂是嗎?是的,實際開發時其實也是這樣。但你先不要管,先擼出來再說。任何複雜的功能,或者你不知道怎麼弄的功能,都用去搜,有庫就用庫,沒庫就搜例子,先保證能跑起來。原理什麼的等你寫完這個東西再去挨個查和學。
對於大多數人來說,學習一定要有快反饋,才有更大的動力堅持下去。
等你邊抄邊寫的搞出那麼幾個網站時,你應該已經擁有一定的開發能力和感覺了。之後的路你應該可以自己摸索出來。這個時候再去擼一擼什麼編譯器之類的,也不是什麼問題了。
祝題主一路順利~看到你這個問題啊,我感慨頗多... 原因也很簡單,因為我在大一的時候也問了這個問題,所以我現在非常非常非常理解你現在的感受。
現在我已經大三了,只能從我這兩年多聊聊我的看法,有些是我自身的經歷,有些是我後悔沒做到的。我姑且說之,大家也就姑且聽之。
在我這一兩年的學習里,我稍稍總結了一下學習的階段,大致分為三個階段。(當然也僅限本科)
第一階段是對學習的對象十分模糊,沒有清晰地概念。 我想這大概也就是題主目前的階段吧第二階段是對學習對象的整體有比較完整結構認識,知道自己掌握了什麼,還需要去學什麼。 這是我現在處於的階段。最後一個階段就是對自己所學的知識體系十分了解,對自己所學知識體系里的內容能由點成面,既有紮實的基礎又能緊跟了解當下的技術。 這是我希望我能本科畢業所做到的。
這當中我個人認為比較困難,或者說對心理因素要求最大的就是從第一階段到第二階段這一個過程轉變了。
在我大一的時候(甚至是現在),也經常會去想要不要去做什麼項目 或者看什麼書,能讓自己一下子搖身一變成為大牛,就好像撿到一本絕世的武功秘籍一樣,自己可以神功練成,天下無敵。
但是作為一名學生,尤其是在學計算機這方面,是沒有任何捷徑可以走的。從一個懵懵懂懂的小白,到一個至少不再迷茫的小佬,這當中的付出可能比從一個小佬變成一個大佬還要讓人心累。所以在這裡,學長給你的第一條建議也是最重要的建議是一定要沉得住氣,靜得下心。學計算機,不要總是在意一朝一暮的所得,而是要將目光放到長遠的以後,並且平心靜氣,堅持不懈的朝著目標前行。
當然了,肯定會有人這樣說,"是啊,你說的道理我都懂啊,但聽了你那麼多大道理,我還對眼前的路該怎麼走,對當下我該怎麼做還是一片迷茫啊!"
啊,你現在肯定會有這個心情,所以呢,我雞湯也灌完了,現在就上一點實質性的乾貨和建議啦
大部分是書單之類的,或者建議。既然題主提了現在是大一,那我掐指一算也是估計大一上快結束了。我就暫時認為題主掌握了C語言的基本語法,學過微積分這一程度吧。
那麼首先你還是要學好微積分123,線性代數。這些理科科目吧,重要是肯定很重要的,因為這些能決定你未來發展的高度,一時學不好也不要太灰心,這些課值得你整個本科不時的花點時間去學習。
然後是C語言和C++這方面,去了解了解面向對象的內容。從普通的《C++程序設計》這類的入手,像類似 C prime plus這些書呢,我的建議是建議看。(自己體會)然後再聊聊演算法和數據結構這方面內容。其實這方面與其說看書不如說做題來的更方便。老話說得好:紙上得來終覺淺,絕知此事要躬行。在這方面更是如此,對於演算法和數據結構的那種思考啊,你不去做做那種類似OJ上的題,你光靠看書很難培養出那種感覺,當然看書也還是很重要的。說白了就是這是理論和實踐都非常非常重要的兩門課。
不過時間也不早了,我就先列個即適合CS本科生,又我看了以後收益良多的書單吧。
演算法和數據結構方面: 《數據結構與演算法分析 C語言描述》《演算法分析與設計》第四版
彙編: 《彙編語言》王爽計算機組成原理: 《深入理解計算機系統》第三版操作系統: 《操作系統 精髓與設計原理》 《一個操作系統的實現》第二版 《linux0.11內核完全注釋》 離散數學: 《離散數學及其應用》概率論與數理統計: 《概率論與數理統計》 陳希孺計算機網路: 《計算機網路 自頂向下方法》 《tcp/ip詳解卷一》資料庫: 《mysql必知必會》 《資料庫系統實現》我也只是一個剛剛大三的計科學生,看的書也不多,書單就先說到這吧。不過有人也會奇怪為什麼為什麼我沒有列出一些類似C++ Java python啊這些語言的學習書籍呢? 嘛,其實語言的學習也是很重要的,不過呢這些我打算和動手實踐啥的放在下次一起講。有空再更新吧( 如果有人關注的話
======================================================================
第二次更新分割線...既然有人提到希望能看看具體我學到了啥的,那我就稍微自我介紹一下下下吧(?)
當然首先我只是一個弱雞,大二打了一年ACM(並沒有什麼成果)刷題平台還是在在各個熟知的OJ上或者codeforce啊啥的,但我交的最多當然還是自家母校的OJ然後嘛也就BC上百度之星那次人品爆發一次,(然後再也不敢動2333
然後大三才開始想起來用用Github所以我的Github上都是一些很弱智的小玩意兒: https://github.com/Yisaer暑假的時候寫博客的一些隨筆: http://yisaer.github.io/趕緊找個女朋友
講真。大一的時候也就自己寫了一個鏈表加文件讀寫的黑框管理系統這樣。心裡已經開心的不行了。下學期玩點acm刷刷題。這樣基本能對編程的整體概念有個了解和興趣。。到大二三就是發揮的時候了。。
我去補個自己做過的好玩項目鏈接。我的知乎回答:想知道大家都用python寫過哪些有趣的腳本? 七十贊已過,我整… http://www.zhihu.com/question/28661987/answer/132391467?utm_source=com.miui.notesutm_medium=social個人覺得比較有趣的是。從webserver開始造一個blog。然後繼續用wordpress
首先補些基礎知識吧,如果老師水平不行就自己看書上網逛,當你對 C"s 全貌有個大概認識後,或者驚奇的發現自己對某一領域特別感興趣,你就可以自己在喜歡的領域深挖,每個領域都有對應的經典論文和前沿頂會,對應若干流行的開源實現,自己擼一個,閱讀開源的代碼,相互比較自己的不足。每個人其實道路不同,個人感覺保持好奇心,保持興趣,保持覺得自己菜的一點點焦慮,保持一點自戀,保持自己思考,保持開放的心態,付諸行動,總能走出自己的路。越早開始越好
啃apue和unp,抄抄例子,寫寫小demo,看看nginx、redis、libevent之類的源碼或者相關解析書籍
寫個webserver然後再買個雲主機買個域名最後寫個網頁掛上去。webserver豐儉由人,可以快速看到結果,還可以把網址發給別人裝X。
多刷演算法 熟悉caozuoxitong。各類實踐操作其實決定你工作待遇的下限。但是好比十八般兵器,你並不知道,你以後會用哪種。而演算法 操作系統和網路決定你的工作待遇上限,能學多深。而且可以斷定,工作三年以上基本一定會用到。如果你從某個方向轉到另個方向 你說你就某個分析寫了個狀態機代碼 ,優化了某個緩存演算法,對文件讀寫傳輸做了改進,工作夥伴們對你評分都會是ok的。但是你說你之前寫了個俄羅斯方塊,可能有些時候效果就不那麼好了。
俄羅斯方塊遊戲的製作為什麼無法完成?還可以做五子棋、黑白棋。超級瑪麗類的,控制一個小人上下左右跳,障礙物啥的。
謝邀...
知乎上大牛很多的,沒想到我竟然會被邀請...我C++用的最多,就說下我使用C++的感受吧
我個人覺得對於C++來說,「實踐性」強的東西不一定是看起來很炫酷(有很花哨的界面等等)的東西,更重要的是能體現出C++的思想以及涉及的知識點,學C++在大多數時候是比較枯燥的,很明顯的一點是,即使你看完《C++ Primer》,你也不能寫界面,想要寫界面就必須藉助其他工具如Qt、MFC等,也就是說必須再學這方面的知識,而對於Java、Python、C#等編程語言來說,寫界面就相對簡單一些
「實踐性」強的,應該是那些能很好的體現出知識的深度和廣度的程序。比如,學完《C++ Primer》,可以實現大整數或複數,應該要包括:- 構造函數(拷貝構造、移動構造)以及賦值(拷貝賦值、移動賦值)
- 運算符重載
- 智能指針
- 繼承
- 模板
- 容器(vector、set、map)
- c++11的常用語法
能實現出來的話,就能很好的把所涉及到的知識變成自己的理解了。
編程這個事情啊,忌浮躁,不能一蹴而就,還是先把基礎打好吧,不知道題主學到哪兒了,至少得靜下心把編程的基礎知識學完,才能一步一步做出炫酷的東西來: )
再說下學習書籍的問題,現在市面上有很多類似《XXX開發實戰》這種書,就是抓住很多人迫切地「想做出炫酷的東西」的心理,基礎知識點一概而過,緊接著就是各種遊戲開發啦,界面實現啦,但是很多這樣的書都是貼個代碼,只告訴你應該這麼寫,對於為什麼這麼寫只是簡單介紹幾句,看這樣的書是很難體會到編程的思想的。
學計算機還是要看經典啊。關於各種語言各個領域的經典書籍,知乎上還是有很多非常棒的回答的。你說的俄羅斯方塊我上個學期做過,不過是看視頻做的,敲得不痛不癢的,感覺也沒學到多少東西
至於操作系統,就別說寫了,我還沒學到。。。
編譯器的話等你以後上編譯原理這門課就會系統地了解編譯的過程了,做實驗應該會讓你寫詞法分析器、語法分析器之類的,但是想做個簡單的編譯器依然還是不夠
題主可以到圖書館借一本《XX語言實驗指導》、《XX課程設計》這樣的書,肯定有你覺得「實踐性強」的實例,不過還是建議題主先打好基礎,至少得學好一門語言啊
ps:我轉專業的,大一那會兒還沒敲代碼呢。。。就我經歷來說,主要是看你是想做實驗 還是想做項目
做實驗嘛,目前被置頂的答案已經回答的很好了。自己看tcp協議規範,實現下;能實現出來,你的水平會大大提升。什麼,你的興趣點不在底層上?
ok,那就玩玩個人博客吧,有能力自己寫一個。沒能力去找個開源的,改改滿足自己的需求。
項目的話,推薦去看看github,按star從高到低排序,找出你感興趣的項目。一上來沒必要直接就當commiter。先去看看其中issue,修修裡面的bug給作者發pull request。慢慢把人家代碼吃透了,可以考慮成為commiter了。當然apacha項目想要貢獻的話,可能門檻比較高,建議先找個人項目摸索摸索再去挑戰apacha項目。
上面說的是開源路線,如果你有路子,也可以嘗試去做做外包,賺點錢。當然做外包遠遠沒有你參與開源項目學習到的東西多。畢竟很多時候魚和熊掌不可兼得。
玩一下樹莓派,至少會知道Linux的操作和Linux神奇的文件系統。
寫一個blog(重點是後端),可以學到http,資料庫的一系列玩意。學好matlab,搞搞數模,還可以加分。(逃。。。Python爬黃網:學習http 多線程 資料庫操作
手寫http庫:學習socket編程(會花費很多精力在細節上,未必合算)
用自己寫的http庫手寫個http伺服器:更多的細節,提高自己的掌控代碼的能力
將第一步下好的小黃片放在自己寫的伺服器上,有興趣可以學一波流媒體。
恭喜你,現在你可以躺在床上看黃片了
(這就是我在做的事)推薦閱讀:
※如何從小培養孩子對 Linux 的興趣?
※為什麼 iPad 選擇了 iOS,而不是沿用Mac OS X?
※為何android應用的安裝文件體積這麼大?