精華區beta C_and_CPP 關於我們 聯絡資訊
我標題想了好久~~實在不會下 但我想問這些問題很久了(滿長的請見諒) 希望大家能夠提供一些看法 我目前也不知道這要怎麼google... 我是剛進入公司工作 性質是寫AP.... 從大學接觸程式到研究所 我好像寫的程式也都是非常上層 我所定義的上層 是指 所有功能都是拿別人現成的API or Lib來用 像是 讀圖, 存圖 讀音效撥音效 了不起我寫過唯一的網路程式 用BCB ...也是很簡單要丟啥字串 傳到某function 他就幫我送給對方了(我覺得好厲害我根本不懂網路) 我所做的 只是把他們提供的API 再包一包 搞成一個可以run的程式 不懂這些的人看到我的程式好像很厲害 有一些特殊的功能 疏不知我根本不懂原理..........簡單一句...我只是call function 邏輯我有 但是技術我完全沒有.... 在工作環境上 我剛進公司沒多久 我看到的AP 也都是用一堆API 建構出來的華麗程式 問了問同事 阿你們都懂原理喔 回: 不知道阿... 舉個例 拿我所看到的google Android (java) 有提供camera這class camear.Initial camera.什麼的 哇靠 就有camera抓到的影像秀出來 別人不懂還以為我連camera都會寫 好厲害喔....我只能說 我只是call function... 這讓我有一個感慨 難道寫AP的 都學不到技術嗎?我不用懂技術只要會呼叫該用的function就有辦法 把程式寫出來 好像不用資工系 只要會call function 邏輯有 一般有興趣想寫AP的人都可以來寫阿 有bug(邏輯bug)在慢慢de就好 component都不是我們寫 我們能寫出的bug 也是邏輯上的bug... 他們component寫錯了 我根本不會知道是他們寫錯 因為我根本不懂原理..... 請過來人指證我 我真的到現在都是這樣認為.....我也不想這樣下去.... 我自己到現在底子很差 沒有技術知識 我又對硬體一竅不通 所以以下我想問一個問題(可能很腦殘 但我真的不知道) 我一直在想 一個API 是怎麼和底層溝通 舉個例: 我想畫一條線 (windows系統) 我很高興的去msdn找到類似叫drawline的函式 我呼叫了 也真的給我畫出來 可是drawline是微軟寫死的 他怎麼有辦法把資料丟給顯示卡要他畫圖?? 顯示卡 好多種規格 牌子 為什麼我灌了driver OS就有辦法知道他 並且drawline這API就能夠畫圖了? 這中間可能卡了好幾層 但我不知道這之間的觀念 我就卡在 api已經寫死了 底層是如何讓OS和顯示卡接起來這個橋樑 以上我認為我寫AP我根本不用管這些 但是又覺得說 我不懂這些 又覺得自己很像啥都不會... 這例子也可以改成 我呼叫一行他就可以播放音樂 我呼叫一行 他就有辦法把字串透過網路送出去 為什麼standard library cout<<可以把字串印到console視窗內... 這都怎麼做到的 微軟的API都寫死了 你硬體(是driver嗎)需要遵照什麼規範去實做嗎????? =========================================================== 和一些大學同學聯絡 他們目前工作性質有的是寫韌體 有的是寫一些影音串流包含網路 閒聊中 他們可以講出他在做什麼 用了哪些技術 哪些是他負責在弄的 寫韌體的 也講說什麼 阿就照spec 他要我哪個ping怎麼樣我就照他的寫阿 他講的簡單 我卻無法體會 我根本就不懂.... 我呢......啥都沒得講 我還是只會call function.... 當然AP沒這麼好寫 我自己是認為寫AP 你OO一定要有一定水準 你coding的style也要越來越嚴謹 一堆error都要記得去handle 雖然我現在也弱弱的 但感覺在職場呆一陣子 我頂多C++或是被迫使用的OO language變強 或是變成coding機器... 但我技術還是沒有學到阿....... 可能有人會說自己花時間學~~但是真的在公司 也不可能偷偷自修自己想學的東西 真正下班了 都很晚了 根本不會想再去自修.....能玩就不錯了 = = 我真的很佩服寫底層的 寫driver阿 寫一些核心技術的人 感覺他們才是真正又會寫程式 又會開發新技術的人員... 請板友們 替我解解惑吧..... 自己覺得我再寫上層的東西 但是要是沒底層的人 我根本就無法寫出來 我覺得我已經變成 要寫程式 只要找不到API就不會寫了的情況... 是只有我有這種疑惑嗎 大家都對整個 os hw driver firmware 這些 都有基本的觀念嗎?? 我是都沒有才想潑版請教各位 謝謝~~請指教 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.192.83.99
walker2009:感覺牽涉很廣@@ OS 計組 組語 compiler 很多很多.. 03/27 03:38
walker2009:我也是囫圇吞棗XD 需要有厲害的大大整個有系統的說明 03/27 03:39
walker2009:好期待這篇的回應(興奮) 感覺可以學到很多 03/27 03:40
wa120:懂原理就好摟 原理是拿來應用的 也不需要到底層 03/27 04:37
wa120:像TCP/IP就懂它的handshaking camera就懂它的RGB raw data 03/27 04:39
wa120:同樣是Call function,有些人就是可以最佳化 03/27 04:40
wa120:差別就是在對原理了不了解 03/27 04:41
costbook:修過計算機組織、微處理機實習、系統程式...就知道了 03/27 04:44
costbook:或者是弄個嵌入式板子來玩 03/27 04:45
wa120:當程式會寫 以前教觀念的書本重看一次真的會超有收獲 03/27 04:46
operationcow:去看看 Minix 的程式碼, 自己寫一個作業系統就知道了 03/27 04:57
operationcow:以你問的 drawline 為例, CPU 有兩種 mode, text 03/27 05:01
operationcow:mode 和 graphic mode, 傳統的 command line, CPU 是 03/27 05:01
operationcow:在 text mode, 單位是一個字, 要如何寫就是用 bios 03/27 05:02
operationcow:提供的中斷, 現今的 GUI 則是 CPU 處於 graphic mode 03/27 05:03
operationcow:寫的方式應是 memory mapped IO 03/27 05:04
operationcow:單位則是 pixel 03/27 05:04
operationcow:如你所說的, 如果是 standard library cout, 當你是 03/27 05:05
operationcow:在 command line 的系統, standard library 最終call 03/27 05:05
operationcow:OS 的 API, OS 的 API 則是用 bios 的中斷 03/27 05:06
operationcow:如果是在 GUI, 那你輸出的會被轉成像 pixel 的型式 03/27 05:07
operationcow:才被畫上螢幕 03/27 05:07
operationcow:至於你說的網路, 則牽扯到 network stack, 但是最接 03/27 05:08
operationcow:近底層的部分, 還是不外乎剛剛說得那兩種方式 03/27 05:09
operationcow:有錯請指正 <(_ _)> 03/27 05:11
yauhh:你轉烤麵包機的旋鈕時,不必忙著思考線路上的原理. 03/27 06:15
sunneo:弄嵌入式系統 trace kernel就可以猜出些端倪 03/27 06:25
sunneo:從之前看到ip 113到公司 時間過好快...@_@ 03/27 06:27
sunneo:不過再早期確實會碰到kernel api不足支援的問題 03/27 06:28
VictorTom:推y大, 轉烤麵包機的旋鈕時,不必忙著思考線路上的原理 03/27 07:53
VictorTom:就算是寫所謂比較底層的東西, 也不見得需要去弄懂每一個 03/27 07:54
VictorTom:API/LIB怎麼實作的, 不同vendor不一定實作方式也不同. 03/27 07:55
VictorTom:真正有需要的公司, 公司自有一套機制train你給你需要研 03/27 07:55
VictorTom:讀的資訊(不管是底層的SW或HW怎麼做). 軟硬體包山包海, 03/27 07:56
VictorTom:你想弄懂所有東西, 那就卯起來讀書卯起來trace code吧. 03/27 07:57
VictorTom:最後, 寫AP也沒有這麼淺, 或者說寫程式也沒有這麼容易. 03/27 07:58
sawang:單純寫AP,也有一堆演算法資料結構可以研究啊 XDD 03/27 10:23
sawang:要花的時間也是很多低~ 03/27 10:24
Bencrie:呃 ... text跟graphics mode是顯示卡那邊的事吧 @@a 03/27 10:53
Bencrie:x86的工作模式是有 real mode跟protected mode XD 03/27 10:54
operationcow:遇到行家了, good. 那他是怎麼切換的阿, 我只知道有 03/27 10:56
operationcow:兩個 mode 可供切換, 不過不知道他實際怎麼切換的? 03/27 10:57
operationcow:看了 EFI 也沒找到相關的程式碼 03/27 10:58
Bencrie:API就是要給人家call的,有興趣的東西再深入研究就好了 03/27 10:59
clanguage:你要看real mode 切 protected mode 就看 x86 programmi 03/27 11:41
clanguage:g guide 就好了 去圖書館也找的到專書 03/27 11:41
clanguage:填暫存器填一填 設定分頁和分段 03/27 11:42
operationcow:real mode 跟 protected mode 我知道, 這蠻基本的 03/27 12:31
operationcow:我是想請問 text mode 和 graphic mode 之間的切換 03/27 12:31
QQ29:大家推文的專有名詞我...都沒概念= = 我不是說寫AP很容易@@ 03/27 13:03
QQ29:只是覺得寫AP會學到的東西可能有限 技術方面能碰到的機會很少 03/27 13:03
QQ29:主要是我從來沒有會過底層 沒有這觀念 有點希望知道這方面的 03/27 13:05
QQ29:概觀 不然我只會call有的東西 沒的話我就不知道怎下手了 03/27 13:05
costbook:有時候有穩定可靠的開發工具比自己去從頭寫還重要 03/27 14:34
wa120:我會從他們的API去推測他們的記憶體管理策略 03/27 14:53
wa120:倒是覺得沒有Call function那麼簡單 03/27 14:54
wa120:因為在很多情況 資料量大的時候很容易overflow 03/27 14:55
QQ29:我也想要有推敲她怎麼寫的能力 但是我就一直不懂.... 03/27 14:58
QQ29:某一個環節..... 03/27 14:59
fragileness:有興趣的話可以改找driver相關的工作啊XD 03/27 15:01
hilorrk:那你要不要學量子力學來徹底瞭解電子是啥東西啊...XD 03/27 20:59
dk3208:我覺得寫ap可以學到一些架構面的東西,不一定就比driver容易 03/27 21:34
dk3208:你看到那些能夠reuse的component內部也可能只是多call了一 03/27 21:36
dk3208:層api 03/27 21:36
dk3208:能夠設計這些component也是很有學問的...XD 03/27 21:37
StubbornLin:做出那些層次本來就是要讓你不懂底層也能用 03/27 22:00
StubbornLin:只是你如果懂底層比較知道如何去最佳化 03/27 22:00
StubbornLin:在上層做東西不代表就沒問題要解決 03/27 22:01
StubbornLin:因為你依賴的是下面的那些東西,當那些有問題時 03/27 22:01
StubbornLin:你可能就得想辦法去讀下面的東西,做出workaround來 03/27 22:02
> -------------------------------------------------------------------------- < 作者: tylpk (tylpk) 看板: C_and_CPP 標題: Re: [問題] 程式是如何建構出來的??? 時間: Sat Mar 27 21:51:39 2010 : 我真的很佩服寫底層的 : 寫driver阿 寫一些核心技術的人 : 感覺他們才是真正又會寫程式 又會開發新技術的人員... : 請板友們 替我解解惑吧..... 如果以系統整合廠來說,就算是寫 driver,很多時候也是 call function。 舉例來說,假設我有一顆 IC 要透過 I2C 下參數給它, 你會發現其實那個 I2C 的函式也是人家做好的。 有興趣的話,可以 trace code,並對照 I2C 的運作原理,就會比較容易理解。 不過大部份的人應該都是沒興趣吧? 我倒覺得可以先拿簡單一點的例子來練習,比如說要設定 CPU 某一根 pin 腳, 大部份會再有一個 function 把設定暫存器的細節隱藏起來, 如果 trace code 看到一堆奇怪的 #define,去找到實際 mapping 的位址, 再對照 cpu spec 有關 gpio 的章節,便會有原來如此的感覺。 我覺得很多事情實際碰到會比較有感覺,會比看書有感覺多了。 (還在寫 AP 時,手頭約有三、四本嵌入式的書,當時只覺得好像是天書!) : 自己覺得我再寫上層的東西 但是要是沒底層的人 我根本就無法寫出來 : 我覺得我已經變成 要寫程式 只要找不到API就不會寫了的情況... : 是只有我有這種疑惑嗎 大家都對整個 os hw driver firmware 這些 : 都有基本的觀念嗎?? 我是都沒有才想潑版請教各位 正巧我也有寫過 AP! 拿我前前公司的一個例子來說好了, 客戶要測試做出一張 DVD 塞滿醫療影像專屬格式(DICOM DIR)的時間要多久? 很不巧的我們的程式跑了兩天都還沒結束! 後來在幾個重要地方插入時間,終於順利找到兇手, 原來問題是出在購買函式庫的 function 上, 但問題就來了,我們又不可能叫原廠改? (很恐怖,不要問XD) 最後的解決方式就是自己 K 規格書, 搞清楚 binary 檔案的格式, 自己用二進位寫檔的方式解決。 所以囉,你說你不會寫,是因為還沒有遇到問題吧XD 不管如何,掌握判斷問題的能力與解決問題的能力是一定要有的, 這樣有問題時才會有個方向, 這必須仰賴自己的不斷進修。 當然不同程式會有不同需求的地方, 就從相關且自己有興趣的地方切入吧。 假設寫 browser,試著只用最簡單的 TCP API,自己去組 http 的 header, 重點是這件事做了會讓你覺得有趣並想繼續。 畢竟 Code 海茫茫,學海無涯呀。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.45.210.105
YesIam118:TCP是protocol吧 應該說用自己用socket兜出來 03/27 22:00
dk3208:推!!! 03/27 22:02
operationcow:http 是用 TCP 當作 transport layer, 他說用 TCP 03/27 23:05
operationcow:API 也不能算錯, 切入的角度不同而已 03/27 23:05
VictorTom:推:) 03/28 00:51