1. 一台計算機對n個數據源進行分時採集,送入主存,然後分時處理。採集數據時,最好的方案是使用什麼
一台計算機對n個數據源進行分時採集,送入主存,然後分時處理。採集數據時,最好的方案是使用n個指針的n個緩沖區。
數據採集系統的基本要求是:快、准。
快,就是要能夠實時採集,不丟數據。n個通道採集,在多任務環境下要做到不丟數據游渣,就只能每個通道獨立緩存數據了。
准,就是採集的數據要准確無誤,精度有保證。考慮到要防止多通道間的數據重疊,就只能用堆棧或多緩存方式了。
(1)程序員如何選擇多任務處理擴展閱讀:
指針的作用:
1、指針使程序的不同部分能夠共享數據
類似於共享內存,如果將某一個數據值的地址從一個函數傳遞到另外一個函數,這兩個函數就能使用同一數據。
2、利用指針,能在程序執行過程中預留新的內存空間
大多數情況下,可以看到程序使用的內存是通過顯式聲明分配給變數的內存(也就是靜態內存分配)。這一點對於節省計算機內存是有幫助的,因為計算機可以提前為需要的變數分配內存。
但是在很多應用場合中,可能程序運行時不清楚到底需要多少內存,這時候可以使用指針,讓程序在運行時獲得新的內存空間(實際上應該就是動態內存分配),並讓指針指向這一內存更為方便。
3、指針可以用來記錄數據項之間的關系
在高級程序設計應用中,指針被廣泛應用於碰薯構造單個數據值之笑磨者間的聯系。比如,程序員通常在第一個數據的內部表示中包含指向下一個數據項的指針(實際上就是鏈表了),來說明這兩個數據項之間有概念上的順序關系。
2. 運維程序員如何快速處理線上問題
對於大多數運維程序員來說,時時刻刻都需要關注伺服器和系統程序可能出現的問題並提前解決。今天我們就通過案例分析來了解一下,運維程序員如何快速處理線上問題。
任何一旦掉進坑裡,明智的做法一定是:跳坑_>填坑_>避坑,線上故障處理的過程也一樣,優先順序從高到低,線上故障處理的目標如下:
跳坑
『跳坑』——快速恢復線上服務,或者將對線上服務的影響降到低。
線上服務的可用性決定著服務者的客戶利益,影響著公司的收益。一旦線上環境不可用,無法服務用戶,給公司/團隊帶來經濟利益損失的同時,更為嚴重的會給公司/團隊帶來惡劣的名聲。所以一般公司都會對線上環境提出穩定性和可靠性的要求,這也是團隊乃至部門的kpi。為此,遇到生產故障後的一要務是:恢復生產服務,即使不能完全恢復線上服務,也要想盡辦法將對線上服務的影響降到低。
填坑
『填坑』——找到問題原因,根本上解決問題。
在恢復線上服務,盡大限度減掉對用戶/公司/團隊帶來的影響後,我們需要徹查問題,搞清楚故障發生的根本原因,從根本上解決問題。通常情況下,『填坑』和『跳坑』是同步在做的,完成『填侍吵坑』也就意味中乎拿『跳坑』成功,但是也有一些緊急情況下的特別『跳坑』方法,比如重啟服務,或者服務降級/熔斷等等,實際並未在當時完成『填坑』,而是先採取非常規手段『跳坑』,之後再慢慢『填坑』。
避坑
『避坑』——舉一反三,消滅隱患。
找到了根本原因,解決了問題之後,我們需要舉一反三,以此及彼,想想在這個故障排查和處理過程中,那些環節存在弱點?那些流程/規范/制度需要優化?這類問題是否在其他系統或者團隊中也存在?通過這樣的反思和自我批評,形成一份線上事故報告,不斷完善流程,避免再次踩坑,也在團隊中交流經驗,共同提高。
線上故障處理的思路
依據線上故障處理的目標及目標的優先順序,線上排障的一目標是恢復線上服務或者降低對線上服務的影響,關鍵點在於快速二字,在『跳坑』-『填坑』之後,再行回溯總結,以便『避坑』。因此,可以將線上故障處理的步驟分為:
故障發現
故障定位
故障排除
故障回溯
其中前三步是『跳坑』行為,後面一步包含了『填坑』和『避坑』。
上述步驟並不是說要從上到下順序進行,建議在不亂陣腳的情況下,並行去做,因為通常線上故障後會緊急啟動故障處理程序,運維、開發、測試、產品各個角色都會參與進來,這時候分工下去,並行去做,不斷匯總消息,做出判斷,以求快速排障歲談搭,恢復服務。這個思路類似於操作系統的fork/join設計思想,目的在於提高效率。
在無法快速找到故障原因的時候,需要果斷跳過故障定位環節,直接進行故障排除,比如採用服務降級、伺服器擴容等手段,確保對線上服務降到低且可控。北京北大青鳥建議可以等到線上服務』撐』過去之後,我們再慢慢定位故障原因,根本上解決問題。
3. Eclipse客戶端程序中多線程的使用[1]
本文分析了Eclipse中多線程程序的實現 討論了在Eclipse客戶端程序開發中應用多線程的方法和要注意的問題 同時也討論了多線程程序的一些調試和問題解決的方法
Eclipse作為一個開發平台 使用越來越廣泛 基於Eclipse Rich Client Platform開發的客戶端程序也越來越多 在當今越來越復雜的應用環境中 我們的客戶端程序不可避免的要同時進行多任務的處理 一個優異的客戶端程序都會允許用戶同時啟動多個任務 從而大大提高用戶的工作效率以及用戶體驗 本文中我們來談談Eclipse中實現多任務的方式
在我們基於Eclipse的Java程序中 我們有很多種方式提供多任務的實現 熟悉Java的朋友立即會想到Java的Thread類 這是Java中使用最多的一個實現多任務的類 Eclipse平台為多任務處理提供了自己的API 那就是Job以及UIJob Eclipse中的Job是對Java Thread的一個封裝 為我們實現多任務提供了更方便的介面 以下是Job的基本用法
清單 Job用法示例
Job job = new Job( Job Name ){protected IStatus run(IProgressMonitor monitor) {// 在這里添加你的任務代碼return Status OK_STATUS;}};job schele(delayTime);在Eclipse中我們也會經常用到Display asynchExec() 和Display synchExec()來啟動任務的執行 這兩個方法主要為了方便我們完成界面操作的任務 以下是Display asynchExec()的用法 Display synchExec()和它類似
清單 Display synchExec()用凱納法示例
Display getDefault() asyncExec(new Runnable() {public void run() {// 在這里添加你的任務代碼}});通常 在Eclipse中我們最好使用Eclipse提供的Job介面來實現多任務 而不是使用Java的thread 為什麼呢?主要有以下幾個原因
Job是可重用的工作單元 一個Job我們可以很方便的讓它多次執行 Job提供了方便的介面 使得我們在處理中能夠很方便的與外界交流 報告當前的執行進度 Eclipse提供了相應的機制使得程序員可以方便的介入Job的調度 例如我們可以方便的實現每次只有一個同一類型的Job在運行 Eclipse預設提供了Job管理的程序 可以查看當前所有的Job和它們的進度 也提供UI終止 暫停 繼續指定的Job 使用Job可以提高程序的性能 節省線程創建和銷毀的開銷 Eclipse中的Job封裝了線程池的實現 當我們啟動一個Job時 Eclipse不會馬上新建一個Thread 它會在它的線程池中尋找是否有空閑的線程 如果有空閑線程 就會直接用空閑線程運行你的Job 一個Job終止時 它所對應的線程也不會立即終止 它會被返回到線程池中以備重復利用 這樣 我們可以節省創建和銷毀線程的開銷 下面我們從幾個方面來討論Eclipse中Job的實現和使用方面的問題
Eclipse中Job的實現
Eclipse的核心包中提供了一個JobManager類 它實現了IJobManager介面 Eclipse中Job的管理和調度都是由JobManager來實現的 JobManager維護有一個線程池 用來運行Job 當我們調用Job的schele方法後 這個Job會被JobManager首先放到一個Job運行的等待隊列中去 之後 JobManager會通知線程池有新的Job加入了纖團運行等待隊列 線程池會找出一個空閑的線程來運行Job 如果沒有空閑線程 線程池會創建一個新的線程來運行Job 一旦Job運行完畢 運行Job的線程會返回到線程池中以備下次使用 從上面Job運行的過程我們可以看到 JobManager介入了一個Job運行的全盯豎沒過程 它了解Job什麼時候開始 什麼時候結束 每一時候Job的運行狀態 JobManager將這些Job運行的信息以介面的方式提供給用戶 同時它也提供了介面讓我們可以介入Job的調度等 從而我們擁有了更加強大的控制Job的能力
為了我們更方便的了解Job所處的狀態 JobManager設置Job的一個狀態標志位 我們可以通過Job的getState方法獲得Job當前的狀態值以了解其狀態
NONE 當一個Job剛構造的時候 Job就會處於這種狀態 當一個Job執行完畢(包括被取消)後 Job的狀態也會變回這種狀態 WAITING:當我們調用了Job的shele方法 JobManager會將Job放入等待運行的Job隊列 這時Job的狀態為WAITING RUNNING:當一個Job開始執行 Job的狀態會變為RUNNING SLEEPING:當我們調用Job的sleep方法後 Job會變成這一狀態 當我們調用schule方法的時候帶上延時的參數 Job的狀態也會轉入這一狀態 在這一段延時等待的時間中 Job都處於這一狀態 這是一種睡眠狀態 Job在這種狀態中時不能馬上轉入運行 我們可以調用Job的wakeup方法來將Job喚醒 這樣 Job又會轉入WAITING狀態等待運行
lishixin/Article/program/Java/gj/201311/27703
4. java程序員面試時被問到:如何在j2ee項目中處理高並發量訪問 該怎麼回答 請仔細看題干再回答
一般需從三點入手。
一、程序本身支持高並發。
簡單來說就是要優化我們的代碼。
1、避免使用錯誤的方式,盡量不用instanceof做條件判斷,不要將數組聲明為:public static final 。
2、使用java中效率高的類,比如盡量使用HashMap 和ArrayList ,除非必要,否則不推薦使用HashTable和Vector ,後者由於使用同步機制,而導致了性能的開銷。
3、盡量指定類的final修飾符 帶有final修飾符的類是不可派生的。在Java核心API中,有許多應用final的例子,例如java.lang.String。為String類指定final防止了人們覆蓋length()方法。另外,如果指定一個類為final,則該類所有的方法都是final。Java編譯器會尋找機會內聯(inline)所有的final方法(這和具體的編譯器實現有關)。此舉能夠使性能平均提高50% 。
4、盡量重用對象,避免頻繁的使用new對象。對於整個應用只需要存在一個實例的類,我們可以使用單例模式。對於工具類可以使用靜態方法的方式訪問。
用new關鍵詞創建類的實例時,構造函數鏈中的所有構造函數都會被自動調用。但如果一個對象實現了Cloneable介面,我們可以調用它的clone()方法。clone()方法不會調用任何類構造函數。
在使用設計模式(Design Pattern)的場合,如果用Factory模式創建對象,則改用clone()方法創建新的對象實
例非常簡單。例如,
Java代碼收藏代碼
下面是Factory模式的一個典型實現:
(){
returnnewCredit();
}
改進後的代碼使用clone()方法,如下所示:
privatestaticCreditBaseCredit=newCredit();
(){
return(Credit)BaseCredit.clone();
}
上面的思路對於數組處理同樣很有用。
5、特別是String 對象的使用中,出現字元串連接情況時應用StringBuffer 代替。由於系統不僅要花時間生成對象,以後可能還需花時間對這些對象進行垃圾回收和處理。因此,生成過多的對象將會給程序的性能帶來很大的影響。
6、StringBuffer 的使用:StringBuffer表示了可變的、可寫的字元串。
它有三個構造方法 :
StringBuffer();//默認分配16個字元的空間
StringBuffer(intsize);//分配size個字元的空間
StringBuffer(Stringstr);//分配16個字元+str.length()個字元空間
你可以通過StringBuffer的構造函數來設定它的初始化容量,這樣可以明顯地提升性能。這里提到的構造函數是StringBuffer(int length),length參數表示當前的StringBuffer能保持的字元數量。你也可以使用ensureCapacity(int minimumcapacity)方法在StringBuffer對象創建之後設置它的容量。首先我們看看StringBuffer的預設行為,然 後再找出一條更好的提升性能的途徑。
StringBuffer在內部維護一個字元數組,當你使用預設的構造函數來創建StringBuffer對象的時候,因為沒有設置初始化字元長度,StringBuffer的容量被初始化為16個字元,也就是說預設容量就是16個字元。當StringBuffer達到最大容量 的時候,它會將自身容量增加到當前的2倍再加2,也就是(2*舊值+2)。如果你使用預設值,初始化之後接著往裡面追 加字元,在你追加到第16個字元的時候它會將容量增加到34(2*16+2),當追加到34個字元的時候就會將容量增加到 70(2*34+2)。無論何事只要StringBuffer到達它的最大容量它就不得不創建一個新的字元數組然後重新將舊字元和 新字元都拷貝一遍――這也太昂貴了點。所以總是給StringBuffer設置一個合理的初始化容量值是錯不了的,這樣會帶來 立竿見影的性能增益。
StringBuffer初始化過程的調整的作用由此可見一斑。所以,使用一個合適的容量值來初始化StringBuffer永遠都是一個最佳的建議。
7、盡量使用局部變數,調用方法時傳遞的參數以及在調用中創建的臨時變數都保存在棧(Stack)中,速度較快。其他變數,如靜態變數、實例變數等,都在堆(Heap)中創建,速度較慢。另外,依賴於具體的編譯器/JVM,局部變數還可能得到進一步優化。請參見《盡可能使用堆棧變數》。
8、不要重復初始化變數 默認情況下,調用類的構造函數時, Java會把變數初始化成確定的值:所有的對象被設置成null,整數變數(byte、short、int、long)設置成0,float和double變數設置成0.0,邏輯值設置成false。當一個類從另一個類派生時,這一點尤其應該注意,因為用new關鍵詞創建一個對象時,構造函數鏈中的所有構造函數都會被自動調用。
9、在JAVA + ORACLE 的應用系統開發中,java中內嵌的SQL語句盡量使用大寫的形式,以減輕ORACLE解析器的解析負擔。
10、Java 編程過程中,進行資料庫連接、I/O流操作時務必小心,在使用完畢後,即使關閉以釋放資源。因為對這些大對象的操作會造成系統大的開銷,稍有不慎,會導致嚴重的後果。
11、由於JVM的有其自身的GC機制,不需要程序開發者的過多考慮,從一定程度上減輕了開發者負擔,但同時也遺漏了隱患,過分的創建對象會消耗系統的大量內存,嚴重時會導致內存泄露,因此,保證過期對象的及時回收具有重要意義。JVM回收垃圾的條件是:對象不在被引用;然而,JVM的GC並非十分的機智,即使對象滿足了垃圾回收的條件也不一定會被立即回收。所以,建議我們在對象使用完畢,應手動置成null。
12、在使用同步機制時,應盡量使用方法同步代替代碼塊同步。
13、盡量減少對變數的重復計算
例如:
for(inti=0;i<list.size;i++){
…
}
應替換為:
for(inti=0,intlen=list.size();i<len;i++){
…
}
14、盡量採用lazy loading 的策略,即在需要的時候才開始創建。
例如:
Stringstr=「aaa」;
if(i==1){
list.add(str);
}
應替換為:
if(i==1){
Stringstr=「aaa」;
list.add(str);
}
15、慎用異常
異常對性能不利。拋出異常首先要創建一個新的對象。Throwable介面的構造函數調用名為fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法檢查堆棧,收集調用跟蹤信息。只要有異常被拋出,VM就必須調整調用堆棧,因為在處理過程中創建了一個新的對象。 異常只能用於錯誤處理,不應該用來控製程序流程。
16、不要在循環中使用try...catch,應把其放置在最外層。
17、合理的使用Java類 java.util.Vector。
簡單地說,一個Vector就是一個java.lang.Object實例的數組。Vector與數組相似,它的元素可以通過整數形式的索引訪問。但是,Vector類型的對象在創建之後,對象的大小能夠根據元素的增加或者刪除而擴展、縮小。請考慮下面這個向Vector加入元素的例子:
Java代碼收藏代碼
Objectobj=newObject();
Vectorv=newVector(100000);
for(intI=0;
I<100000;I++){v.add(0,obj);}
5. 程序員是怎樣解決問題的
程序員的五部曲:
第一、理解問題
解決問題的首要前提是客觀准確地理解問題,這樣我們才能抓住問題的本質,對症下葯。
客觀
為什麼強調客觀呢?在生活中,這樣的情境很常見。
我們可以很客觀地去評價他人,甚至是給他人給出合理的意見,但是同樣的一件事情,放到我們自己身上,我們可能就會覺得束手無策。
通常情況下,我們對於自己的評價是帶走自我保護心理的。
自己遇到問題,我們會下意識地弱化問題,或者情櫻型緒化地來理解問題,造成問題的失真。
魔鏡的故事就是一個最典型的賣頌改例子。
准確
當我們對自身的問題評價做不到客觀的時候,我們往往也不會准確理解問題。
還有,准確的定義是找到問題的關鍵所在。這個怎麼做呢?
我們仿照時中判間管理的方式。
首先對自己所要解決問題的過程做一個較為詳細的記錄。
堅持記錄幾天之後,我們需要將所有的記錄結果進行匯總,分析,找出漏洞最大的地方。
那麼這個洞也就是所謂的關鍵,我們也就可以找到解決問題的突破口。
舉個例子,筆者前段時間開始用手機軟體記錄自己的時間花銷,記錄幾天之後,就會發現,自己時間浪費最為嚴重的是娛樂。
知道了時間浪費的黑洞,那麼接下來就該思考時間黑洞產生的原因了。
時間浪費的主要原因是兩個
第一,目標流失
當我在網上查資料,或者用手機寫作的時候,總會進入其他的瀏覽頁面,等到自己發覺的時候,時間已經過去大半。
這個我稱之為目標流失。也就是我們在網頁瀏覽的時候已經忘記了自己最初的目的,比如說你本來想找一本書籍的txt版本,但是後來你發現自己瀏覽了一下午的娛樂新聞。
第二,多任務處理
這個問題我是經常遇到。比如說,我在進行日更的時候,有新同學發微信,說查一下宿舍的分配情況。
我當時的反應是火急火燎地去其刷微信,信息查詢完畢之後,和分配在同一宿舍的同學聊了一下午。
最要命的是,等到你刷完屏的時候,你有很大可能會忘掉你在更這件事。
或者說你還記得,但你的精力已經消耗的差不多了,你會告訴自己,等會再更,然後你有很大的概率會斷更。
找到時間黑洞形成的原因,那麼就可以尋求解決措施了。
第二、計劃
為自己的病症設置一個完整的療程,根據問題出現的原因,制定每一步要採取的手段。
第三、拆解
這一步是和計劃聯系在一起的,只不過它的要求更加細化。
它需要我們將計劃的每一步都拆解成可以執行的步驟,感興趣的讀者可以參考筆者的另外一篇文章《如何讓遙不可及的夢想變得觸手可及?》
第四、卡殼
可以說,我們每個人都有改變的想法,也確實有很多人嘗試去做了,為什麼還有那麼多的放棄者。
因為在執行計劃的時候,出現的變數讓我們卡殼了。卡殼再正常不活了,那為什麼會放棄?
答案是自我負罪感。
當我們卡殼的時候,我們大多數人會產生一種負罪感,就是覺得自己定計劃的時候,詳盡完備,而且自己已經堅持了這么長時間,會陷入一種自我懷疑,也就是負罪感。
解決的辦法是立即採取行動,而不是描述問題本身,這也是我們解決所有問題的一個心態。
我們不要緊盯著問題本身,你理解問題的過程就是在採取行動,相反,你逢人就說,我遇到什麼問題,我有多痛苦,沒有任何意義。
第五、練習
其實這個步驟是對前面幾步的一個綜合。
這五部曲是一個閉環,是需要反復進行的,因為問題會不斷出現。
回頭看過去的生活,我們的歷程何嘗不是這樣?不斷遇到新問題,不斷解決問題,然後獲得新的體驗。
想看更多文章
歡迎關注大魚號【小妖影視】
6. 程序員怎麼提高工作效率
程序員提高效率的一些建議
我是一個程序員、設計師和企業家,也是 Asana 的聯合創始人。許多知名公司(如:Uber,Pinterest,Dropbox)都在使用這款提升團隊生產力的軟體。我在 Facebook 做開發經理時,設計過一個用於提升團隊生產力的工具,Facebook 至今仍在使用該工具。
改善環境
避開所有打擾
「多任務處理」使人感到更有效率,但研究表明,它使我們變得更加低效。我們經常去查看郵件,這種頻繁的打斷使我們思維變得遲緩 ,我們需要花費比預期更多的時間回到原來事情上。所以當你需要集中注意力時:
將手機設置為勿擾模式。在 iPhone 上:從屏幕的底部向上滑動,然後點擊月亮圖標。
關掉所有與當前任務不相關的網頁。
如果你的工作需要寫郵件,寫郵件時不要看到新郵件。在 Gmail 中的 Gmail 書簽(過濾掉所有內容)可以實現這一點。
關掉計算機上的新郵件提醒。
退出聊天軟體。
發現你的時間流
如果一天中你不斷地被會議打斷,你很難進入時間流、處理復雜任務的狀態。
在日程表上標注自己有一個三個小時的「會議」,你是會議的唯一參與人員。這樣同事們在安排會議時會避開這段時間,你可以在這段時間里不間斷地將工作完成。
如果可以話,每周選擇一天作為全公司的無會議日。在 Asana,我們設有「無會星期三」。
跟蹤了解你一天中不同的活動的高效時間。在你的高效時間完成工作最難的部分。下圖是我用來確定我的高效時間的方法,我的高效時間是上午 10 點到中午。相關閱讀:尋找你的超人時間。
精通你使用的工具
如果你一整天都在使用電腦,每次你伸手去拿滑鼠的時候,都會降低一點速度,阻礙你的時間流。你操作計算機的速度應該跟上你思維的速度。這樣做你需要學習常用軟體的快捷鍵。
每次需要使用滑鼠時候,看看是否可以使用快捷鍵代替。通常你可以在菜單項中找到對應快捷鍵,或當你把你的滑鼠游標放到按鈕上會顯示出快捷鍵提示。在 Mac 上:⌘ 是 Command,⌥ 是 Option,⇧ 是 Shift, ^ 是 Ctrl。
使用軟體 SizeUp,可以迅速重新排列軟體窗口,不需要使用滑鼠。
優化思維
這方面我最喜歡的書籍之一是托尼·施瓦茨的《全心投入的威力:管理精力而非時間》。 僅僅是這本的書名就有很大啟發性。
定時休息
通常我們以為,在工作上花費的時間越多,完成的任務也就越多。事實並非如此,人類不是機器,我們的大腦需要時間恢復。人類不是機器人。我們的頭腦需要時間來充電。研究表明,工作 90 分鍾,休息 15 分鍾,有助於在更少的時間里完成更多的工作 。
冥想
照顧好自己的.身體
多喝水。 每天早上,我都會在辦公桌上放 5 大杯水。我每天下班時,都已經把水喝完了。看到桌上放的這些水,會提醒我喝了多少水。
改善飲食。 碳水化合物過高的午餐會使你下午精力不足。
運動: 每周兩次有氧運動可以幫助提高效率。
總之,使用的工作外的時間來修養身心,工作時會更加精力充沛。
直面困難、克服拖延
我們拖延,不是因為懶惰,而是因為任務的重要性會使我們感到焦慮。發生這種情況時,你應該做以下的事:
誠實面對你焦慮的原因。把導致焦慮的事情寫下來,或者告訴你朋友。你為什麼感到如此害怕?
尋找一個容易執行的下一步。
關於這方面,我寫過一篇文章:《如何通過面對焦慮克服拖延》。
如果你現在沒有精力去面對恐懼,那麼至少做你的清單上的第二優先的事情,而不是去查看 Facebook。多產的斯坦福大學教授約翰·佩里把這種做法稱為「結構化的拖延症」。在網站 StructuredProcrastination.com 上,他把自己的成功歸結於這種做法。
優化流程
設定清晰的計劃。許多低效源於沒有分清事情的輕重緩急。你沒有搞清楚哪些事情有助於實現你的目標、什麼是最高優先順序的事情。
在下一步計劃沒有完全明確,並且整個團隊達成一致之前,不要開始行動。
先思考這些事情:我們的目標是什麼?我們為什麼想要達成該目標?達成該目標需要哪些步驟?每一個步的負責人是誰?這些步驟的順序是怎樣的?什麼是所有去實現它所需的步驟?每一步驟由誰負責?這些步驟將按照什麼順序執行?
團隊合作
有些人喜歡獨自工作,但是,處理復雜任務時,我一般覺得困難、容易分心。
找一個願意合作的隊友。有時候,花費我兩天的任務可以在 2 小時內與合適的夥伴完成。 「結對編程」是軟體行業很常見,但它其實適用於任何領域。
或者,你可以進行自我對話,問問自己那些問題是重要的,然後把問題和答案寫到文本編輯器或者筆記本里。我在電腦上以隨意的形式寫過一些長篇的對話,這些對話都是富有策略性的,有成效的。
公開聲明最後期限
將同伴的壓力轉化為你的優勢。如果一項重要任務沒有固定的最後期限,我會自信地告訴別人:「我會在周五下班時送給你一份作業副本」。我不想在同事面前表現得很可笑,所以我會努力確保事情在周五完成。
使用軟體來跟蹤你的工作
毫無疑問,我認為 Asana 在這方面是最好的。它不僅為維護你的待辦事項清單;它同時還管理整個團隊的工作流程,所以你們不需要無休止的會議來保持同步。Asana 讓大家在工作的地點面對面的交流,這樣你就不需要一直通過電子郵件去獲取信息。
花點時間反省
每一天結束用幾分鍾考慮一下:什麼地方做的好,什麼地方做的不好。你的整個工作流程是否有可以改進的地方?如果你每天都可以提升 1% 的效率,一年後你的效率將有 15 倍提升。
7. 程序員需要具備的基本技能,你都知道嗎
下面是程序員所應該具備的基本職業技能:
基本技能 技能描述
閱讀代碼 這個技能需要程序員能夠具備讀懂已經存在的代碼的能力,這樣的能力可以讓程序員分析程序的行為,了解程序,這樣才能和開發團隊一起工作,繼承維護或是改進現有的程序。
編寫程序 編寫程序並不包括程序設計。不要以為編程是一件很簡單的事情,很多程序員都認為編程只需要懂得程序語言的語法,並把設計實現就可以了。但是這離編寫程序還遠遠不夠,使用什麼樣的編碼風格成為編寫程序員最需要具備的基本技能。能否使用非常良好的編程風格直接決寫了程序員的級別。
軟體設計 這一能力直接決定了需要吏用什麼樣的代碼技術達到怎麼樣的功能,而系統架構設計直接決定了軟體的質量、性能和可維護性。並不是所有的程序在這一方面都非常優秀,但每個程序員都需要或多或少的明白和掌握這一基本技能。
熟悉軟體工程 每個程序員都應該明白軟體工程是什麼東西,都應該知道,需求分析 設計,編碼測試,Release和維護這幾個階段。當然,幾乎所有的人都知道這些東西,但並不是每個人都很清楚這些東西。現在很多高級程序員都會混淆「需求規格說明書FS」和「概要設計HLD」。另外,程序員還需要知道一些軟體開發的方法論,比如:敏捷開發或瀑布模型。
使用程序庫或框架 一個程序員需要學會使用已有的代碼,無論是標論的程序庫,或是第三方的,還是自己公司內部的,都需要學會做。比如:C++中,需要學會使用STL,MFC,ATL,BOOST,ACE,CPPUNIT等等。使用這些東西,可以讓你的工作事半功倍。
程序調試 程序調試是分析BUG和解決問題最直接的能力。沒有人能夠保證程序寫出來不用調試就可以運行正常 也沒有人可以保證程序永遠不會出BUG。所以,熟練使用調試器是一個程序員需要具備的基本技能
使用IDE 學會使用IDE工具也會讓你的工作事半功倍。比如,VC++,Emacs Eclipse等等,並要知道這些IDE的長處和短處。
使用版本控制 一定要學會使用版本控制工具,什麼叫mainline/trunk,什麼叫tag,什麼叫branch,怎麼做patch,怎麼merge代碼,怎麼reverse,怎麼利用版本控制工具維護不同版本的軟體。這是程序員需要明的的軟體配置管理中最重要的一塊。
單元測試 單元測試是每個程序都需要做的。很多單元測試也是需要編碼的。一定要學會在xUnit框架下進行單元測試。比如JUnit, NUnit, CppUnit等等。
重構代碼 每個程序員都需要有最基本的能力去重構目前已有的代碼,使代碼達到最優但卻不能影響任何的已有的功能。有一本書叫《軟體的重構》 每個程序員都應該讀一下
自動化編譯 程序員需要使用一個腳本,其能自動化編程所有的工程和代碼,這樣整個開發團隊可以不停地集成代碼 自動化測試,自動化部署,以及使用一些工具進行靜態代碼分析或是自動化測試。
當然,還有很多的基本技術也是非常重要的,比如,與人的溝通能力,語言的表達能力,寫作能力,團隊協作能力,適應變化的能力,時間管理能力,多任務處理能力,自我學習能力,故障處理能力,等等,等等,這里只是列舉了和技術相關的能力,這些是程序最最最基本的能力,只要是程序員就必需要有的能力。