『壹』 嵌入式硬體工程師和軟體工程師都有35歲的限制嗎
沒有35歲的限制。
身邊看起來35歲以上嵌入式硬體工程師和軟硬體工程師都挺多,應該不是未老先衰。
軟體的話是因為團隊大,所以35歲以上工程師也比較多。核心職位被「霸佔」著,比如架構師,軟體項目經理,領域專家崗;也有追求生活工作平衡的普通35歲以上軟體工程師,以高級工程師的職位做著不太繁重的工作。
總體感覺是,技術發展沒那麼快,而且比較吃沉澱,更偏好軟硬體都懂些,所以這個行業還是比較偏愛經驗型選手,暫時還是穩定老選手勝過新人。
軟體工程師主要有以下職責:
1、指導程序員的工作。
2、參與軟體工程系統的設計、開發、測試等過程。
3、協助工程管理人保證項目的質量。
4、負責工程中主要功能的代碼實現。
5、解決工程中的關鍵問題和技術難題。
6、協調各個程序員的工作,並能與其它軟體工程師協作工作。
7、還要編寫各種各樣的軟體說明書。
8、考試科目工程師是中級職稱,考試的題目包括了計算機體系結構、軟體工程、資料庫、數據結構、編譯原理等計算機學科的基礎課程。
『貳』 程序員的必備技能有哪些
數組、字元串與哈希表
任何受過專業訓練的程序員,對「數據結構」這門課程中涉及到的各種數據結構都不會陌生,但是在實際的編程工作中,大部分的數據結構都不會用到,而且也永遠都不會用到。雖然如此,深入地理解基本數據結構的概念和實現細節,仍然是每個程序員的任務。這不僅僅是因為,掌握這些知識將有利於更加正確和靈活地應用它們,而且也是因為,對於語言背後的實現細節的求知慾是一個優秀程序員的素質。
正則表達式
在程序員日常工作中,數據處理占據了相當的比重。而所有的數據之中文本又占據了相當的比重。文本能夠被人理解、具有良好的透明性,利於系統開發、測試和維護等就必需要有一定規律遵循一種規則,當你掌握一門正則表達式語言,就能夠培養你編程的直覺本能,達到較高水平,也能夠在實踐中提供更高的開發和執行效率。
調試
軟體調試是軟體工程的一個重要部分,其過程出現在軟體工程的各個階段,從最初的可行性分析、原型驗證、到開發和測試階段、再到發布後的維護與支持,都有軟體調試過程參與。學習和靈活運用軟體調試技術,不僅可以提高程序員工作效率,而且有利於對代碼的感知力和控制力,加深對軟體和系統的理解。此外,調試技術是解決各種軟體難題的一種有效武器,它直擊要害、銳不可擋,相對其它間接方法具有明顯的優勢。軟體有大美,調試見真功!
兩門語言
任何一位職業化的軟體技術人員都會將編程語言當成自己的利器。它們代表了開發人員對計算機本身的理解與對軟體開發工作的執著。同時,建立在編程語言之上的基礎也標志著程序員的職業化道路發展到了一個新的階段,而單一語言又有一定的局限性,軟體開發的本質就是處理信息以及數據。一種專門用來處理數據的腳本語言常常是走向更加職業化的必備武器之一。所以精通兩種語言,對於任何一個開發人員來說,並非必須,但是對於一個專業化程度較高的開發人員來說,又常常是必要的。
一個開發環境
隨著技術的進步,IDE已經越來越強大,遠遠超出我們心目中的最初形象,越來越多的內容被涵蓋到IDE中,從需求分析、業務建摸大批軟體發布,IDE已經逐漸覆蓋了軟體開發的整個生命周期。
SQL語言
說起SQL,絕大多數程序員對其作用都瞭然於胸--用來訪問資料庫嘛。確實,數據是信息系統的核心,沒有數據的計算機應用沒有任何意義。信息系統中,大量數據本質上就以實體--關系的模式存在,而RDBMS支持SQL這么簡單但表達能力豐富的訪問介面,同時還提供了內建的事務ACID特性保證和故障恢復能力--因此,RDBMS理所當然地成為了大部分信息系統的標准數據存儲介質。於是,無論使用何種語言開發信息系統,從C、C++,Delphi到java,從Perl、python到Ruby,使用SQL訪問RDBMS都是我們必須修煉的武功秘籍。
編寫軟體的思想
說起程序員的武器自然少不了技術書籍,它們就像是拳譜、劍經、雖然不能馬上轉化為巨大的傷害輸出,但假以時日勤以研讀,有朝一日成為傍身絕學也是說不定。不過雖然各類技術書籍汗牛充棟,除去入門時淺顯易用的參考和復雜深奧的學術專著,能夠讓所有程序員常看常新的心法秘籍還是不多。
『叄』 JAVA初級程序員要考哪些內容
JAVA初級程序員
現在有 SCJP 這個比較權威點(SUN 公司的)~~~在這個考試費用是 1250元 如果你是在大學
還可能享受優惠 只要 450 元
考點:
Section 1 Declarations and Access Control
目標1, 創建數組
採用不同的格式來編寫任一基本數據類型數組的聲明,構造及初始化的代碼。
數組是一連串對象或基本數據,它們必須同型,並以一個標識符封裝在一起。數組好象一個對象,通過new關鍵字來創建。
聲明數組
數組的聲明並不能為數組分配內存。聲明時數組不能有大小信息,也就是說編譯器並不允許你告訴它究竟數組有多大,它只是一個reference(引用),並沒有對應的空間。聲明數組的方式有: int[] a1; int a1[]兩種,int num[5]是錯誤的數組聲明方式。
聲明並創建數組
聲明一個數組並同時為它分配內存。
Int num[] =new int[5];
聲明並初始化數組
聲明一個數組並同時進行初始化。
Int num[]=new int[]{0,1,2,3,4};
Int num[]=new int[5]{0,1,2,3,4}; //!錯誤
數組知道自己的大小
與c++不同,數組知道自己的大小,當數組越界時,會拋出異常。數組具有length屬性(不是length()方法),它能告訴你數組的大小。
多維數據
int m[][] ; int [] m[]; int[][] m;
數組的預設值
與其它的變數不同,不論數組在向處創建,它總是使用可以使用預設值。
目標2 聲明類與變數
聲明類,內部類,方法,實例變數,靜態變數,自動變數(局部變數),正確使用各種修飾符(public , private , static ,final, abstract)。
在JAVA中萬事萬物皆對象,即使JAVA程序本身也是對象。
類的定義和對象的生成
public class MyClass{ //類定義
int i;
float f; //類數據成員
void amethod(){ //方法
int i; // 局部變數
}
}
MyClass aClass =new MyClass(); //創建類的一個實例(對象)
修飾符說明
private
被了變數所在的類,其它任何類都不可以訪問這個成員。
無訪問修飾符
所謂的包訪問許可權,同一個包內的其它類可以訪問這個成員。
Protected
與無訪問修飾符具有許可權外,還允許子類訪問這個成員。
Public
具有全局可視性,任何其它類都可以訪問這個成員。
Static
Static變數稱為類變數,類的所有對象共享這個變數。
Static方法稱為類方法,它只能訪問static變數。靜態方法不能被子類overriding為非靜態方法,但靜態方法可以被子類靜態方法所Hided.
Native
只用於方法,指明方法體是由其它編程語言編寫的。它以;結尾不是以{}結尾。
Public native void fastcalc();
Abstract
Abstract修飾符可用於類與方法前,在用於方法前時表明方法不具備方法體。只支類中包括了抽象方法則它必須聲明為抽象類。如果一個類實現一個介面時,它沒有為介面中所有的方法提供實現時,也必須聲明為抽象類。
Final
Final修飾符可用於類,方法和變數,fianl類不能被繼承,所有final類中的方法都是教學final方法。Final變數的值必須在創建時設定並具不能被修改。
Synchronized
防止多個線程同時訪問相同的代碼段。
Transient
表明類序列化時,變數不必序列化。
Volatile
表明變數由於線程可能非同步修改。
目標3 預設構造器
結定一個類,確定是否有預設構造器
構造器是與類名相同的方法,並具沒有返回值。預設構造器是一個不具有任何參數的構造器。在你沒有提供構造器的條件下,編譯器為自動化為你提供一個預設的構造器,但一旦你定義了任何一個構造器,編譯器就不會為你提供預設構造器。在這種條件下,如果你使用不具有參數的構造器將有錯誤。
構造器可以有訪問修飾符,但不能有native,abstract,static,synchronized和final修飾符。
目標4 重載與覆寫
為所有在自己或父類中的相關方法聲明有效的返回值,
相同類中的方法
當在同一個類中有多個方法具有相同的名稱時,這個方法就被重載了。只有參數的次序和類型是區分重載方法的依據,而返回值和參數的名稱對區分重載方法沒有貢獻,所以,不能以返回值的不同來重載方法。
子類中的方法
可以在子類中重載父類的方法,只要新的重載方法具有不同的參數次序或類型。當你在子類中的方法具有於父類中的方法相同的signature,則稱子類覆寫了父類的方法。注意:子類覆寫父類方法,它的訪問修飾符可以不同,但子類要具有比父類更加嚴格的訪問許可權。
靜態方法不能被覆寫只能被HIDED。
基本類型為參數的重載
基本類型可以自動進行窄化轉型(narrowing conversion),在沒有相應數據類型的重載方法,它的數據類型向上晉升。
Section 2 Flow control and exception Handling
目標1 if 和switch語句
使用if和switch編寫代碼並能區分有效的參數類型
if的條件語句中只能是boolean型的數據。
Int k=1;
If(k ) System.out.println(k); // 錯誤
If(k==1) System.out.println(k); // 正確
Switch的條件語句中只能是int數據類型,或int的窄化數據類型也就是byte, char, short
Long i;
Switch(i){ //錯誤
Case 1: .. break;
Case 2: … break;
Default: ..
}
case語句的break的使用,在switch塊中只有遇到break語句時,塊才跳出。
Default語句不必總安排在switch語句的最後,但default語句不在最後時,要使用break.
三元操作符 ?:
目標2 循環,break和continue
編寫各種(不)具有label的break和continue的循環語句。明確循環開始與結束時,循環記數器的值。
For 循環
語法:
for(initialization; conditional expression;increment)
逗號運算符
它只能用於for的控製表達式中。
for(int i=1,j=i+10;i<5;i++,j=i*2)
do-while與while的區別在開do-while中的語句至少執行一次。
Goto與break,continue
雖然goto是java的保留字,但java而不使用它。Java中的跳躍功能由break與continue提供。在java中,惟一一個放置lable而能夠產生效益的地點就是恰恰放在迭代語句前。一般而論,break與continue只會中斷當前的循環,而與label搭配,可以中斷多層循環。
Label1:
Outeriteration{
Inneriteration{
…
break; //1
…
continue; //2
….
Continue label1;//3
….
Break label1; //4
}
}
1中斷內層迭代,回到外層迭代
2將執行點移至內層迭代的起始處
3同時中斷內層迭代,再從外層迭代開始
4同時中斷內外層迭代,不再進行任何迭代
務必記下。在java中使用label的惟一理由是跳過一個以上的嵌套層次。
目標3 try/catch語句與方法覆寫
正確使用異常與異常處理語句(try,catch,finally)來編寫代碼,正確處理覆寫方法的異常。
異常一詞,意指「我對這件事有異議:我對這件事感到意外」。在問題發生點,你可能自己處理異常,有時,你可能不知道如向處理,就是說在當前的context並不具備中以修改問題的信息,你可將問題交付給高層的context的處理。
覆寫有異常拋出的方法
覆寫具的異常拋出的方法時,子類的方法只能拋出父類方法所拋出的異常或它的子異常。但是,子類方法可以拋出少於父類的異常或乾脆就不拋異常。
方法聲明的Throws子句
拋出子句意指當錯誤發生時,方法拋出這個異常而這個方法的調用者必須處理(catch)這個異常異常。
目標4 如時異常發生
認識代碼段中異常發生的地方以它的影響。注意:異常可能是運行時異常,檢測異常或錯誤。
錯誤無需捕捉
異常的出處:
Java標准庫類拋出的異常
自己的類拋出的異常
執行期發生的任何意外
檢測異常與非檢測異常
檢測異常你必須捕捉,而非檢測異常你不必捕捉。
非檢測異常發生後,預設條件下會在控制台上列印一條消息。對某些非檢測異常可用編碼來避免。
public class GetArg{
public static void main(String argv[]){
if(argv.length ==0){
System.out.println("Usage: GetArg param");
}else{
System.out.println(argv[0]);
}
}
}
檢測異常必須被捕捉,方法在調用某個拋出檢測異常的的方法時,它或者捕捉它或拋出它。
public FileInputStream openFile(String filename)
throws FileNotFoundException{//拋出異常,自己不處理
FileInputStream fis = new FileInputStream(filename);
return fis;
}
或
public FileInputStream openFile(String filename) {
FileInputStream fis;
try{
fs= new FileInputStream(filename);
}catch(FileNotFoundException ex){
ex.printStackTrace();
}
return fis;
}
finally子句
finally子句總是會執行,即使try/catch中已有了return語句finally中的語句也會執行。但如果try/catch中有System.exit(0),finally語句不會執行。
Catch子句
Catch子句的捕捉異常的次序要與異常的層次結構相一致。也就是說子異常要先捕捉,父異常後捕捉。反之,編譯器會拋出子異常已捕捉的信息。其它要注意是:異常被拋出後,異常處理根據捕捉的排列次序,尋找最近的處理程序。
目標5 使用斷言
正確編寫斷言代碼
assertion功能提供了一種在代碼中進行正確性檢查的機制,這種檢查通常用於開發和調試階段,到了軟體完成部署後就可以關閉。這使得程序員可以在代碼中加入調試檢查語句,同時又可以在軟體部署後關閉該功能而避免對軟體速度和內存消耗的影響。基本上,assertion功能就是JAVA中的一種新的錯誤檢查機制,只不過這項功能可以根據需要關閉。
斷言的語法
assert somebooleatest
或
assert somebooleantest : someinformatinvemethod
斷言的使用
斷言的使用就好比注釋的使用,注釋向其它人表明其閱讀的代碼是正確的,而斷言用於保證在程序執行過程中booleanTest的值一定是真。斷言用於確保某些東西總是為真的。預設條件下,斷言功能是關閉的。
編譯開啟斷言功能。
javac -source1.4 Myprog.java
運行開啟斷言功能
enableassertions的參數:
no arguments
Enables or disables assertions in all classes except system classes.
packageName...
Enables or disables assertions in the named package and any subpackages.
...
Enables or disables assertions in the unnamed package in the current working directory.
className
Enables or disables assertions in the named class
例如:
java –enableassertions:my.package… MyProg
java –ea Myprog
What should you assert to be true?
斷言用於你認為某此東西必須是真的地方。例如:人的年齡必然大於0,又如你認為在一套if/else判定後,必然有判定成功的分支,就可在if/else後,插入斷言。例如:
switch(lang){
case Language.java:
System.out.println("java");
break;
case Language.pascal:
System.out.println("pascal");
break;
case Language.csharp:
System.out.println("csharp");
break;
default:
assert false : lang;
}
斷言使用的地方
應該使用的情形 不應該使用的情形
用於保證內部數據結構的正確 不用於保證命令行參數的正確
用於保證私有(private)方法參數的正確 不用於保證公共(public)方法參數的正確
用於檢查任何方法結束時狀態的正確 不用於檢查外界對公共方法的使用是否正確
用於檢查決不應該出現的狀態 不用於保證應該由用戶提供的信息的正確性
用於檢查決不應該出現的狀態,即使你肯定它不會發生 不要用於代替if語句
用於在任何方法的開始檢查相關的初始狀態 不要用做外部控制條件
用於檢查一個長循環執行過程中的的某些狀態 不要用於檢查編譯器、操作系統、硬體的正確性,除非在調試過程中你有充分的理由相信它們有錯誤
在不開啟斷言功能時的輸出:
在開啟斷言功能時的輸出:
Section 3 Garbage Collection
Objective 1,2 & 3
State the behaviour that is guaranteed by the garbage collection systemWrite code that explicitly makes objects eligible for garbage collection. Recognize the point in a piece of source code at which an object becomes eligible for garbage collection.
為什麼要進行垃圾收集
當內存中的對象不再被利用時,系統就要回收內存。Java中不用擔心垃圾收集,系統的垃圾收集器會自動回收沒有引用的對象所佔用的內存。注意:你能建議或鼓勵 JVM進行垃圾收集但你不能強迫它。
確保的行為:finalization
Java確保在對象被收集調用finalize方法。垃圾回收器用於釋放「對象內存」,由於java中所有的東西都是對象,所以finalize不用來回收釋放內存。Finalize方法的使用時機是代碼採用了native方法,它調用了非java的內存分配方式,所以你得在finalize方法中以native的方式釋放內存。
對象被回收的時機
當垃圾收集機制認為對象上沒有引用時,它調用垃圾收集器來回收對象。當垃圾收集是非確定性的,你不能預測它發生的時間,你也不能預測finalize方法准確的運行時間。
Note: Once a variable is no longer referenced by anything it is available for garbage collection.
You can suggest garbage collection with System.gc(), but this does not guarantee when it will happen
非可達
當對象非可達時,就是可能進行回收。非可達的原因為:對象明確被設置為null或指向它的引用數為0。
Section 4 Language Fundamentals
Objective 1, Packages, import, inner classes, interfaces
Identify correctly constructed package declarations, import statements, class declarations (of all forms including inner classes) interface declarations, method declarations (including the main method that is used to start execution of a class), variable declarations, and identifiers.
目標1 包,導入,內類與介面
正確的識別包聲明,導入聲明,類聲明(包括內類),介面聲明,方法聲明(包括main方法),變數聲明和修飾器。
包語句
包用於解決名字沖突,一般開發者以自己的internet域名的反序作為包名的第一部分。這樣你就可以生成獨一無二的包,這樣包中的類就不會有名稱上的沖突。例如:package cn.e.xjtu.scjp 這樣就可以產生獨一無二的類名:cn.e.xjtu.scjp.Question
注意: 包聲明語句必須位於其它語句之前,除了注釋語句
導入語句
導入語句位於包語句之後,其它語句之前。導入語句是為了方便代碼編寫,導入相應的包後,包中的類可以僅以局部名使用,而不以全限定名來使用。
Import cn.e.xjtu.scjp.*;
Question q=new Question();
或
cn.e.xjtu.scjp.Question q=new cn.e.xjtu.scjp.Question();
導入語句對性能的沒有影響,它就好比DOS環境中設置路徑。
注意:If a source file has a package statement, it must come before any other statement apart from comments
類與內類的聲明
類聲明
一個文件只能包含一個public類,但可以包含多個非public類。這些類在編譯後將生成各自獨立的.class文件。
內類,即定義在其它類之中的類。
介面定義
介面是純粹的abstract class.它所定義的方法不包含方法主體。介面也可定義數據成員,但這些數據成員自然而然的成為了static和final. 介面中的方法即使沒有聲明為public,它們也會是public,所以實現介面時,必須將實現的方法定義為public。
例子:
interface Instrument{
int i=5;// static & final
void play(); // automatically public
…
}
class Wind implments Instrument{
public void play(){} //必須定義為public
…
}
main方法
main方法是程序運行的起點,方法的signature
public static void main(String argv[])
public:方法全局可見性 static:類方法 void: 無返回值 String[]:參數為字元串數組
main不是java的關鍵字,可以用它來定義變數。Main方法的參數是由命令行來提供的。
State the correspondence between index values in the argument array passed to a main method and command line arguments.
Java Aclass arg0 arg1 …
變數聲明
變數的名稱:它必須是一個合法的標識符。標識符以字母開頭的Unicode字元串;不是關鍵字,布爾直接值(true,false)或保留字(null);它在作用范圍內必須是唯一的。
合法的變數: _avariable, avariable$, (註:_,$可用於變數名)
數據類型:boolean-8/1 byte-8 -128~127
short-16 -32768~32767 int-32 long-64
float-32 double-65 char-16 0~65536
數據類型轉型(casting operators)
在java中只有進行窄化轉換(narrowing conversion)時才有風險,寬化轉化(widening conversion )時就無需明確指示。
數據運算中的晉升(promotion)
在比int小的基本數據類型上進行任何數學運算或位運算時,運算之前會先晉升為int,其結果也會是int類型。如果你要將結果指給較小的類型時,要進行轉型。
目標2 使用介面,
明確實現介面類,介面是Runnable或其它的用戶自定義的介面
Interfaces -Programming by contract
介面是在類之間建立了一個協議(protocol),或者說合同編程。 意味一個開發者開發了介面其它開發者要守它的條件。介面的別一個用處是實現多重繼承。Java中類只能繼承一個非介面類,其餘繼承的來源得是介面。正確的寫法是:
DeriveClass extends BaseClass implements interface1,interface2{}
介面合並時的名稱沖突
Objective 3, Passing values from the command line
State the correspondence between index values in the argument array passed to a main method and command line arguments
運行一個例子就明白:
public class MyParm{
public static void main(String argv[]){
String s1 = argv[1];
System.out.println(s1);
}
}
java MyParm hello there
程序將輸出there不是MyParm也不是hello
Objective 4, identify keywords
abstract boolean break byte case catch
char class const * continue default do
double else extends final finally float
for goto * if implements import instanceof
int interface long native new package
private protected public return short static
strictfp super switch synchronized this throw
throws transient try void volatile while
Objective 5, Unassigned variables
State the effect of using a variable or array element of any kind when no explicit assignment has been made to it.
Java保證變數絕對會在被使用前初始化。每個基本類型的數據成員都保證有初值(O)。而引用數據類型的數據成員的初值為null.
The default values for numeric types is zero, a boolean is false and an object reference is the only type that defaults to a null.
局部變數(在方法中定義的變數)不能預設值,故使用前必須明確賦予初值。
數組總是可以設置預設值的。Before initialization arrays are always set to contain default values wherever they are created.
Objective 6, The range and format of data types
Section 5 Operators and Assignments
Objective 1, Applying operators
Determine the result of applying any operator including assignment operators and instanceof to operands of any type class scope or accessibility or any combination of these.
目標1 使用運算符
操作符的分類
算術操作符 (+ , - , * , / , %,++,--)
一元操作符 (++, --, - , +)
關系和條件操作符 關系操作符(>,>=,<,<=,==,!=) 條件操作符(&&,||,!,&,|,^)
移位操作符(<<,>>,>>>) 位操作符(&,|,^,~)
賦值操作符(=)
其它操作符(?:,[],.,new,instanceof,(類型))
註:除了=,==,!=運算符外,其它運算符只能用於基本類型。String類支持+,+=操作符
例: String aStr=2+」hello」;
instanceof操作符用來檢驗某特殊對象是不是某類或該類的子類的實例,還可以檢驗某對象的類或子類是否實現了某介面。注意,數組也是對象,instanceof同樣適合與數組。
賦值操作符=
基本數據類型的賦值操作
boolean數據只能賦值於另一個boolean數據。不同於c和c++,java中的boolean值只能是true和false。
其它的數據類型可以自由的進行widening conversion(寬化轉換)。而進行narrowing conversion(窄化轉換)由於有精度的損失,必須進行強制轉換。
Primitives may be assigned to "wider" data types, a boolean can only be assigned to another boolean
引用數據類型的賦值操作
引用數據類型的賦值,例如a=b,使得a和b引用指向相同的對象。引用數據類型的賦值可以向上轉型。即一超類的引用可以被賦值一子類對象。但向下轉型必須強制轉換。
Object references can be assigned up the hierarchy from child to base.
++,--: 前序遞增和前序遞減(++a,--a)先進行運算然後才增賦值。後序遞增和後序遞減(a++,a--)先賦值然後才進行運算。
奇怪的++與--:
int a=1,b=5;
b+=b++-a--; (b=9)
b=b++;(b=9)
b=++b; (b=10)
關系操作符
關系操作符(<,>,<=,>=,==,!=)所產生的結果是boolean,==,!=可用於所有的內置的類型,其它運算符不能用於boolean.
奇怪的==(對於引用類型==比較兩個對象的內存地址,這可不是我們想要的)
double d=12.0;
int i=12;
Integer i2=new Interger(12);
Double d2=new Double(12);
Integer i3=new Interger(12);
d==i ; true
i2==i3; false
i2.equals(i3); true
i2.equals(d2) ; false
邏輯操作符
邏輯運算符:&&,||,!只能用boolean值身上。位運算符:&,|,^,~:在兩個操作數的相應位上進行邏輯代數運算。boolean數據不能~b而用!b。&和|和^即是邏輯的(邏輯與,邏輯或和邏輯非)也是位操作的運算符(按位與,按位或和按位異或)。
奇怪的&&與||(短路的&&和||)
當第一個操作數為flase時,如果用&&運算符時,則不檢查第二個操作數就直接返回flase。
當第一個操作數為true時,如果用||運算符時,則不檢查第二個操作數就直接返回true。
移位操作符
無符號右移位操作符>>>,它採用零擴展,高位插入0. 左移位運算符<< 能將運算符左邊的運算對象向左移動運算符右側指定的位數在低位補0。有符號右移位運算符>> 則將運算符左邊的運算對象向右移動運算符右側指定的位數,有符號右移位運算符使用了符號擴展。若值為正則在高位插入0,若值為負則在高位插入1。
註:int或<int的數據類型進行位移操作數先要進行mode 32運算所以對大於32的位移運算,先要進行mode 32運算,所以3>>>32的結果為3。Long數據類型在先要進行mode 64運算。
奇怪的>>>:小的負數進行>>>運算將得到一個大的正數
-1>>>1 : 2147483647
A unsigned right shift >>> by a positive amount of a small negative number will result in a large positive number returned.
操作數的優先順序
優先順序(胃潰瘍患者是c程序員的寫照 Ulcer Addicats Really Like C A lot)
U: ->Unary 一元運算符 ++, -- ,-,+,!,~
A: -> Arithmetic(shift) *,/,%,+,-,>>,>>>,<<
R: -> Relation >,<,>=,<=,instanceof,==,!=
L: -> Logic(bitwise) &,^,|,&&,||
C: -> 三元運算符
A:-> 賦值 = *=
Objective 2, the equals method
Determine the result of a
『肆』 非958,211出身的程序員是一種怎樣的感受
學歷很重要!敲門磚很重要!
親身感受如下:
朋友211本科非計算機專業畢業,去了建信金科,絕對的不加班,除非你想加班。
逢年過節購物卡,每月福利不中斷,一日三餐16薪。
我也想去,談不上養老,但是也能爭取工作生活平衡,再也不用996,朋友遂和HR推薦我去,HR問學歷如何,非985、211,沒機會聊。
翻看一下聊天記錄:
所以,學歷還是很重要的,以後對自己的孩子說:一定要多讀書!不讀書打爛他的屁股,哈哈。。。
另外,我們這幫低學歷的程序員才能體現互聯網的平均工資,不要看那些大廠校招生年薪上來就40w+,他們都是清華、北大、北航、北郵等名校畢業的,中國最優秀的一批人,大部分程序員都在小公司、外包廠一年掙個二三十萬。
不扯淡了,這會兒我還在擼代碼!
首先,我是一個在上海工作六年多的女java程序員,學歷一般,並沒有在大廠的工作經歷。都是在一些大中小企業上班,也算工作經驗比較豐富了。當然我也遇到過身邊的同事是985博士的,是做演算法的,非常厲害,工資也相對非常高。因此我也很羨慕那些學歷高的程序員。
一般而言,大廠都喜歡學歷高的程序員,像我這種學歷一般的在選擇公司時確實有一些局限性,當然在要薪資方面我也會相應降低自己的期許。我也相信,大部分程序員並沒有那麼高的學歷,我們的程序員在普通公司遇到985學生就是本身內心就會覺得別人高人一等,雖然不知道對方技術,但是內心就會覺得自己在各方面比不上對方,有一種天生的自我暗示感。
我們這群普通程序員當然也想進入更好的公司,但是更好的公司卻有著非常嚴格的篩選流程,普通程序員很難能進入這樣的公司。比如,騰訊華為,除了校招進去,其他時候人家根本不對外招聘,更多的是靠獵頭推薦,或者公司內部人員內推,或者即使招聘,學歷卡的非常嚴。而且也要有更漂亮的履歷。如果你本身有大廠經驗那就更容易了。同時,你也需要有穩定的工作經歷,不能讓hr覺得你跳槽頻繁沒有忠誠度,簡歷的真實性要求非常高,更重要的,需要你能通過背景調查。
但是眾所周知,IT行業跳槽漲薪是非常普遍的,很少有程序員能呆至少2年以上,就是因為變現很快,所以有很多培訓機構或者自學成才的程序員也不斷涌現出來,導致現在競爭力非常大,魚目混雜。
我這種普通的程序員只能望而興嘆,好的企業進不去,只能在中小型企業摸爬滾打。當然我也很羨慕大廠的核心技術,但是自己也清楚自己很難進去,總之,很多時候並不是所有的事情都能如願,有時候哪怕你的技術再好,沒有高學歷,沒有大廠經驗,沒有人員推薦,沒有足夠的漂亮履歷,我基本和大廠無緣。而這些985.、211的學生毫無疑問比我們更有資格和捷徑能通過大廠的面試,我們只能羨慕嫉妒恨了!
但是我們就沒有機會再進入 大廠嗎?我覺得還是有機會的。我們可以通過其他自考或者其他方式提升自己的 學歷,可以通過不斷沉澱讓自己積累更多更新的技術,可以通過一切自己能做到的事情讓自己變得更有競爭力,一切都還是靠我們自己本身的 努力了 !加油吧,我們這群普通程序員!
應聘的時候學歷幾乎決定了一切,但是工作多年,有了經驗之後,那就無所謂了,程序員這一行相對還是比較公平的,你的能力最重要。
最真實的感受就是:這塊敲門磚太輕了,簡歷總是會石沉大海,即使我身懷絕技,但是始終敲不開對方的門!
以下內容純屬自身經歷,絕非杜撰。
我誤打誤撞被調劑到了計算機科學與技術學院的,從此開啟了我准程序員的生涯。既然已經被調節到這了,那就好好學一些技術,畢竟自己也還比較喜歡,最起碼不排斥。
因此,大學四年我一直很注重專業課的學習,每天都會在專業課上花三四個小時時間,四年下來我的專業水平說不上特別好,但是絕對不是很差,我自認為稍微努把力,再加點運氣,進一些大廠問題應該不是很大。我的自信不是盲目的,因為我除了學習之外,社團,班幹部, 社會 實踐,比賽經歷,項目經歷這些有的我都有,可以說簡歷相當豐富了。
但是現實給我狠狠的一拳,臨近畢業時,我投過n多家公司,但是投了簡歷大多都石沉大海,有些也會給你一次面試機會,但是面著面著就沒有然後了…
我曾經反思過自身問題,可能是項目經歷不是太豐富,或者我的方向和他們崗位不對口等等諸如此類的問題我都想過,但是都不是正確答案。不服輸的我在有一次投完簡歷石沉大海以後,我就給HR打了電話,結果給我的答案是我的簡歷沒有篩選過,他們更想招211及以上的人。其實這都是大多數公司的套路,他們宣傳的時候說的都是對出身不設門檻,只要有技術就可以,但事實是他們優先選擇211及以上學校的學生簡歷,如果還有名額才有可能輪到你…
其實第一個HR說我的簡歷沒通過篩選,我還不太信,直到第二個HR這么說了之後我才相信了。自認為很好的簡歷在人家眼裡就是不值得,但我又只想一門心思的進大廠,不去小廠,於是我又選擇了考研並順利考上某西部985,我認為只要我考上985研究生,我進大廠應該就很容易了,然而從我身邊師兄師姐的經歷來看,本科非211/985出身的師兄師姐想進大廠也並非那麼容易…
現在學歷有了,但是第一學歷仍是短板。所以一句話:學歷很重要,第一學歷更重要!
當然以上都是我個人經歷,如果你就想隨便去一個互聯網公司,那還是挺容易的,工資還算不錯,但你想去大廠,這些問題你也會碰到。
首先承認排名靠前高校的地位,其畢業生在市場競爭中先天處於優勢。不僅有學校影響,也有畢業生進入市場後所提交的結果反映。師資、環境、人脈、成長度、反哺等一系列積極的綜合效應造成了市場選擇。
不過對於學生來說,好學校是當初的目標不假,但沒去成也要好好活下去吧。所以貓有貓道,鼠有鼠道。改不了環境的時候,就努力改變自己。
作為一個正在迅猛發展的行業,IT散發著及其誘人的荷爾蒙。具體原因不說了,話題多得很。
在IT這個市場里,有各種崗位,這些崗位里,各學校畢業人員分布是有規律的(去除央企和國企),比如演算法崗,名校研究生特別多,也有不少數學進來的;程序崗,本科占據絕大部分;測試崗,初始要求不是特別高,從業者有很多大專生;運維崗,沒深入了解,不做概括。各崗位再細分那就更多了。
有時候大家求的都不是一個崗位,就沒有競爭一說。所以,在自己現有的崗位內,好好乾,多學多思考多實踐,一般都能混的差不多。不要好高騖遠,也不要妄自菲薄,畢竟各個崗位都有大牛貓著(個人以前也是無知,後來碰到了一個大專畢業的碼農,被其瘋狂打臉)。
人都只能活一次,誰能比誰高貴到哪去?未來很美好,給自己一個具體且能實現的目標,不要太多慾望,也別渾渾噩噩,按部就班做,熱愛生命,熱愛家人,臨死無愧就差不多了。
個人技術不到家,就不推薦技術棧了,總之一句話:加油,積極面對生活!
雖然說招人才尤其是程序員,主要靠能力,但是在大公司的加入門檻上,還是會有一定的限制,也就是會卡學歷。但是這東西有兩面性,公司也有自己的考量,在相對占優勢的候選池裡挑選人才,畢竟找到的合適人才概率高一些,但並不否定非名牌高校出身的優秀人才。
對於工程師自身來講,最關鍵的還是要把自己的能力提高上去,尤其是基礎性的專業能力,還包括演算法、數據結構,基礎的掌握程度以及演算法此類的熟悉程度,才能把一個人從平庸提升到優秀。
當下,不缺工程師,稀缺的是足夠優秀的。
程序員本身是一個新的職業,大概是2000年以後才有的最早一批程序員,隨著互聯網的發展大量的程序員湧入市場,培訓機構每年製造大量的程序員。所以很多非名校畢業的程序員,至於這些程序員怎麼感受,我覺得有兩點:
第一:需要努力提升技能,因為這是吃技術飯的行業,優秀的程序員應該是熟悉架構,理解演算法的,不應該只是搬運工,想好好發展下午就必須會架構演算法這些技能。
第二:所有技術都是為業務服務的,要想不被淘汰,需要熟悉你所在行業的業務知識,技術是一部分,業務知識更加是你的加分項。
額,現在的感受就是可不可以重新考一次大學,要不要考個研究生。
坐標廈門。
人才引進補貼本科只有985,211可以享受。
有些企業明確要求只招要985,211。
像在福建美圖和華為這些大企業只去福州大學(211)和廈門大學(985)招聘。
公司裡面優先提拔985,211的同事。
所以你問我什麼感受,直觀感受跟很不爽[我想靜靜]
然後後悔當初沒有好好讀書多考幾分[捂臉]
果然本科只有兩種,一種是985、211。另一種是其他本科[淚奔]
所以努力讀書吧少年!
『伍』 程序員工作前景怎麼樣
程序員的職業發展前景還是非常好的,隨著互聯網的發展IT工程師需求量愈發增大,其中java軟體開發非常受歡迎,現在市面上很多大廠都是使用java語言作為第一開發語言。
學習java是一個不錯的選擇,這專業會學習一下語言:C,JAVA,php,PYTHON,MYSQL,JAVASCRIPT另外就是各個語言的框架,提高開發速度的。下面是跟數據相關的知識。
1.Lua 不會對二進制代碼塊做健壯性檢查。 惡意構造一個二進制塊有可能把解釋器弄崩潰。
運行程序來遍歷表中的所有域。 第一個參數是要遍歷的表,第二個參數是表中的某個鍵。 next 返回該鍵的下一個鍵及其關聯的值。 如果用 nil 作為第二個參數調用 next 將返回初始鍵及其關聯值。 當以最後一個鍵去調用,或是以 nil 調用一張空表時, next 返回 nil。 如果不提供第二個參數,將認為它就是 nil。 特別指出,你可以用 next(t) 來判斷一張表是否是空的。
索引在遍歷過程中的次序無定義, 即使是數字索引也是這樣。 (如果想按數字次序遍歷表,可以使用數字形式的 for 。)
2.當在遍歷過程中你給表中並不存在的域賦值, next 的行為是未定義的。 然而你可以去修改那些已存在的域。 特別指出,你可以清除一些已存在的域。
如果 t 有元方法 __pairs, 以 t 為參數調用它,並返回其返回的前三個值。
否則,返回三個值:next 函數, 表 t,以及 nil。 因此以下代碼
能迭代表 t 中的所有鍵值對。
參見函數 next 中關於迭代過程中修改表的風險。
『陸』 IT培訓分享新手程序員學習python編程需要了解哪些技巧
python編程開發技術是目前比較熱門的編程語言之一了,而對於大多數新接觸python編程的程序員來說,如果能夠掌握一定的編程技巧的話會大大降低我們掌握python編程的難度,下面IT培訓http://www.kmbdqn.com/就一起來了解一下具體內容吧。
建議1:理解Pythonic概念
建議2:編寫Pythonic代碼
建議3:理解Python與C語言的不同之處
建議4:在代碼中適當添加註釋
建議5:通過適當添加空行使代碼布局更為優雅、合理
建議6:編寫函數的4個原則
建議7:將常量集中到一個文件
建議8:利用assert語句來發現問題
建議9:數據交換值的時候不推薦使用中間變數
建議10:充分利用Lazyevaluation的特性
建議11:理解枚舉替代實現的缺陷
建議12:不推薦使用type來進行類型檢查
建議13:盡量轉換為浮點類型後再做除法
建議14:警惕eval()的安全漏洞
建議15:使用enumerate()獲取序列迭代的索引和值
建議16:分清=與is的適用場景
建議17:考慮兼容性,盡可能使用Unicode
建議18:構建合理的包層次來管理mole
建議19:有節制地使用fromimport語句
建議20:優先使用absoluteimport來導入模塊
建議21:i+=1不等於++i
建議22:使用with自動關閉資源
建議23:使用else子句簡化循環(異常處理)
建議24:遵循異常處理的幾點基本原則
建議25:避免finally中可能發生的陷阱
建議26:深人理解None,正確判斷對象是否為空
建議27:連接字元串應優先使用join而不是+
建議28:格式化字元串時盡量使用.format方式而不是%
建議29:區別對待可變對象和不可變對象
建議30:[]、()和{}:一致的容器初始化形式
建議31:記住函數傳參既不是傳值也不是傳引用
建議32:警惕默認參數潛在的問題
建議33:慎用變長參數
建議34:深入理解str()和repr()的區別
『柒』 要成為一名專業的程序員,從零開始需要怎麼一步步來比較好,要把最底層的先學精通嗎(個人認為)求學長
前言
你是否覺得自己從學校畢業的時候只做過小玩具一樣的程序?走入職場後哪怕沒有什麼經驗也可以把以下這些課外練習走一遍(朋友的抱怨:學校課程總是從理論出發,作業項目都看不出有什麼實際作用,不如從工作中的需求出發)
建議:
不要亂買書,不要亂追新技術新名詞,基礎的東西經過很長時間積累而且還會在未來至少10年通用。
回顧一下歷史,看看歷史上時間線上技術的發展,你才能明白明天會是什麼樣。
一定要動手,例子不管多麼簡單,建議至少自己手敲一遍看看是否理解了里頭的細枝末節。
一定要學會思考,思考為什麼要這樣,而不是那樣。還要舉一反三地思考。
註:你也許會很奇怪為什麼下面的東西很偏Unix/linux,這是因為我覺得Windows下的編程可能會在未來很沒有前途,原因如下:
現在的用戶界面幾乎被兩個東西主宰了,1)Web,2)移動設備iOS或Android。Windows的圖形界面不吃香了。
越來越多的企業在用成本低性能高的Linux和各種開源技術來構架其系統,Windows的成本太高了。
微軟的東西變得太快了,很不持久,他們完全是在玩弄程序員。詳情參見《Windows編程革命史》
所以,我個人認為以後的趨勢是前端是Web+移動,後端是Linux+開源。開發這邊基本上沒Windows什麼事。
啟蒙入門
1、 學習一門腳本語言,例如Python/Ruby
可以讓你擺脫對底層語言的恐懼感,腳本語言可以讓你很快開發出能用得上的小程序。實踐項目:
處理文本文件,或者csv (關鍵詞 python csv, python open, python sys) 讀一個本地文件,逐行處理(例如 word count,或者處理log)
遍歷本地文件系統 (sys, os, path),例如寫一個程序統計一個目錄下所有文件大小並按各種條件排序並保存結果
跟資料庫打交道 (python sqlite),寫一個小腳本統計資料庫里條目數量
學會用各種print之類簡單粗暴的方式進行調試
學會用Google (phrase, domain, use reader to follow tech blogs)
為什麼要學腳本語言,因為他們實在是太方便了,很多時候我們需要寫點小工具或是腳本來幫我們解決問題,你就會發現正規的編程語言太難用了。
2、 用熟一種程序員的編輯器(不是IDE) 和一些基本工具
Vim / Emacs / Notepad++,學會如何配置代碼補全,外觀,外部命令等。
Source Insight (或 ctag)
使用這些東西不是為了Cool,而是這些編輯器在查看、修改代碼/配置文章/日誌會更快更有效率。
3、 熟悉Unix/Linux Shell和常見的命令行
如果你用windows,至少學會用虛擬機里的linux, vmware player是免費的,裝個Ubuntu吧
一定要少用少用圖形界面。
學會使用man來查看幫助
文件系統結構和基本操作 ls/chmod/chown/rm/find/ln/cat/mount/mkdir/tar/gzip …
學會使用一些文本操作命令 sed/awk/grep/tail/less/more …
學會使用一些管理命令 ps/top/lsof/netstat/kill/tcpmp/iptables/dd…
了解/etc目錄下的各種配置文章,學會查看/var/log下的系統日誌,以及/proc下的系統運行信息
了解正則表達式,使用正則表達式來查找文件。
對於程序員來說Unix/Linux比Windows簡單多了。(參看我四年前CSDN的博文《其實Unix很簡單》)學會使用Unix/Linux你會發現圖形界面在某些時候實在是太難用了,相當地相當地降低工作效率。
4、 學習Web基礎(HTML/CSS/JS) + 伺服器端技術 (LAMP)
未來必然是Web的世界,學習WEB基礎的最佳網站是W3School。
學習HTML基本語法
學習CSS如何選中HTML元素並應用一些基本樣式(關鍵詞:box model)
學會用 Firefox + Firebug 或 chrome 查看你覺得很炫的網頁結構,並動態修改。
學習使用Javascript操縱HTML元件。理解DOM和動態網頁(Dynamic HTML: The Definitive Reference, 3rd Edition - O'Reilly Media) 網上有免費的章節,足夠用了。或參看 DOM 。
學會用 Firefox + Firebug 或 chrome 調試Javascript代碼(設置斷點,查看變數,性能,控制台等)
在一台機器上配置Apache 或 Nginx
學習PHP,讓後台PHP和前台HTML進行數據交互,對伺服器相應瀏覽器請求形成初步認識。實現一個表單提交和反顯的功能。
把PHP連接本地或者遠程資料庫 MySQL(MySQL 和 SQL現學現用夠了)
跟完一個名校的網路編程課程(例如:http://www.stanford.e/~ouster/cgi-bin/cs142-fall10/index.php ) 不要覺得需要多於一學期時間,大學生是全職一學期選3-5門課,你業余時間一定可以跟上
學習一個javascript庫(例如jQuery 或 ExtJS)+ Ajax (非同步讀入一個伺服器端圖片或者資料庫內容)+JSON數據格式。
HTTP: The Definitive Guide 讀完前4章你就明白你每天上網用瀏覽器的時候發生的事情了(proxy, gateway, browsers)
做個小網站(例如:一個小的留言板,支持用戶登錄,Cookie/Session,增、刪、改、查,上傳圖片附件,分頁顯示)
買個域名,租個空間,做個自己的網站。
進階加深
1、 C語言和操作系統調用
重新學C語言,理解指針和內存模型,用C語言實現一下各種經典的演算法和數據結構。推薦《計算機程序設計藝術》、《演算法導論》和《編程珠璣》。
學習(麻省理工免費課程)計算機科學和編程導論
學習(麻省理工免費課程)C語言內存管理
學習Unix/Linux系統調用(Unix高級環境編程),,了解系統層面的東西。
用這些系統知識操作一下文件系統,用戶(實現一個可以拷貝目錄樹的小程序)
用fork/wait/waitpid寫一個多進程的程序,用pthread寫一個多線程帶同步或互斥的程序。多進程多進程購票的程序。
用signal/kill/raise/alarm/pause/sigprocmask實現一個多進程間的信號量通信的程序。
學會使用gcc和gdb來編程和調試程序(參看我的《用gdb調試程序》)
學會使用makefile來編譯程序。(參看我的《跟我一起寫makefile》)
IPC和Socket的東西可以放到高級中來實踐。
學習Windows SDK編程(Windows 程序設計 ,MFC程序設計)
寫一個窗口,了解WinMain/WinProcere,以及Windows的消息機制。
寫一些程序來操作Windows SDK中的資源文件或是各種圖形控制項,以及作圖的編程。
學習如何使用MSDN查看相關的SDK函數,各種WM_消息以及一些常式。
這本書中有很多常式,在實踐中請不要照抄,試著自己寫一個自己的常式。
不用太多於精通這些東西,因為GUI正在被Web取代,主要是了解一下Windows 圖形界面的編程。@virushuo 說:「 我覺得GUI確實不那麼熱門了,但充分理解GUI工作原理是很重要的。包括移動設備開發,如果沒有基礎知識仍然很吃力。或者說移動設備開發必須理解GUI工作,或者在win那邊學,或者在mac/iOS上學」。
2、學習Java
Java 的學習主要是看經典的Core Java 《Java 核心技術編程》和《Java編程思想》(有兩卷,我僅鏈了第一卷,足夠了,因為Java的圖形界面了解就可以了)
學習JDK,學會查閱Java API Doc Java Platform SE 6
了解一下Java這種虛擬機語言和C和Python語言在編譯和執行上的差別。從C、Java、Python思考一下「跨平台」這種技術。
學會使用IDE Eclipse,使用Eclipse 編譯,調試和開發Java程序。
建一個Tomcat的網站,嘗試一下JSP/Servlet/JDBC/MySQL的Web開發。把前面所說的那個PHP的小項目試著用JSP和Servlet實現一下。
3、Web的安全與架構
學習HTML5,網上有很多很多教程,以前酷殼也介紹過很多,我在這里就不羅列了。
學習Web開發的安全問題(參考新浪微博被攻擊的這個事,以及Ruby的這篇文章)
學習HTTP Server的rewrite機制,Nginx的反向代理機制,fast-cgi(如:PHP-FPM)
學習Web的靜態頁面緩存技術。
學習Web的非同步工作流處理,數據Cache,數據分區,負載均衡,水平擴展的構架。
實踐任務:
使用HTML5的canvas 製作一些Web動畫。
嘗試在前面開發過的那個Web應用中進行SQL注入,JS注入,以及XSS攻擊。
把前面開發過的那個Web應用改成構造在Nginx + PHP-FPM + 靜態頁面緩存的網站
4、學習關系型資料庫
你可以安裝MSSQLServer或MySQL來學習資料庫。
學習教科書里資料庫設計的那幾個範式,1NF,2NF,3NF,……
學習資料庫的存過,觸發器,視圖,建索引,游標等。
學習SQL語句,明白表連接的各種概念(參看《SQL Join的圖示》)
學習如何優化資料庫查詢(參看《MySQL的優化》)
實踐任務:設計一個論壇的資料庫,至少滿足3NF,使用SQL語句查詢本周,本月的最新文章,評論最多的文章,最活躍用戶。
5、一些開發工具
學會使用SVN或Git來管理程序版本。
學會使用JUnit來對Java進行單元測試。
學習C語言和Java語言的coding standard 或 coding guideline。(我N年前寫過一篇關C語言非常簡單的文章——《編程修養》,這樣的東西你可以上網查一下,一大堆)。
推薦閱讀《代碼大全》《重構》《代碼整潔之道》
高級深入
1、C++ / Java 和面向對象
我個人以為學好C++,Java也就是舉手之勞。但是C++的學習曲線相當的陡。不過,我覺得C++是最需要學好的語言了。參看兩篇趣文「C++學習信心圖」 和「21天學好C++」
學習(麻省理工免費課程)C++面向對象編程
讀我的 「如何學好C++」中所推薦的那些書至少兩遍以上(如果你對C++的理解能夠深入到像我所寫的《C++虛函數表解析》或是《C++對象內存存局(上)(下)》,或是《C/C++返回內部靜態成員的陷阱》那就非常不錯了)
然後反思為什麼C++要干成這樣,Java則不是?你一定要學會對比C++和Java的不同。比如,Java中的初始化,垃圾回收,介面,異常,虛函數,等等。
實踐任務:
用C++實現一個BigInt,支持128位的整形的加減乘除的操作。
用C++封裝一個數據結構的容量,比如hash table。
用C++封裝並實現一個智能指針(一定要使用模板)。
《設計模式》必需一讀,兩遍以上,思考一下,這23個模式的應用場景。主要是兩點:1)鍾愛組合而不是繼承,2)鍾愛介面而不是實現。(也推薦《深入淺出設計模式》)
實踐任務:
使用工廠模式實現一個內存池。
使用策略模式製做一個類其可以把文本文件進行左對齊,右對齊和中對齊。
使用命令模式實現一個命令行計算器,並支持undo和redo。
使用修飾模式實現一個酒店的房間價格訂價策略——旺季,服務,VIP、旅行團、等影響價格的因素。
學習STL的用法和其設計概念 - 容器,演算法,迭代器,函數子。如果可能,請讀一下其源碼。
實踐任務:嘗試使用面向對象、STL,設計模式、和WindowsSDK圖形編程的各種技能
做一個貪吃蛇或是俄羅斯方塊的游戲。支持不同的級別和難度。
做一個文件瀏覽器,可以瀏覽目錄下的文件,並可以對不同的文件有不同的操作,文本文件可以打開編輯,執行文件則執行之,mp3或avi文件可以播放,圖片文件可以展示圖片。
學習C++的一些類庫的設計,如: MFC(看看候捷老師的《深入淺出MFC》) ,Boost, ACE, CPPUnit,STL (STL可能會太難了,但是如果你能了解其中的設計模式和設計那就太好了,如果你能深入到我寫的《STL string類的寫時拷貝技術》那就非常不錯了,ACE需要很強在的系統知識,參見後面的「加強對系統的了解」)
Java是真正的面向對象的語言,Java的設計模式多得不能再多,也是用來學習面向對象的設計模式的最佳語言了(參看Java中的設計模式)。
推薦閱讀《Effective Java》 and 《Java解惑》
學習Java的框架,Java的框架也是多,如Spring, Hibernate,Struts 等等,主要是學習Java的設計,如IoC等。
Java的技術也是爛多,重點學習J2EE架構以及JMS, RMI, 等消息傳遞和遠程調用的技術。
學習使用Java做Web Service (官方教程在這里)
實踐任務: 嘗試在Spring或Hibernate框架下構建一個有網路的Web Service的遠程調用程序,並可以在兩個Service中通過JMS傳遞消息。
C++和Java都不是能在短時間內能學好的,C++玩是的深,Java玩的是廣,我建議兩者選一個。我個人的學習經歷是:
深究C++(我深究C/C++了十來年了)
學習Java的各種設計模式。
2、加強系統了解
重要閱讀下面的幾本書:
《Unix編程藝術》了解Unix系統領域中的設計和開發哲學、思想文化體系、原則與經驗。你一定會有一種醍醐灌頂的感覺。
《Unix網路編程卷1,套接字》這是一本看完你就明白網路編程的書。重要注意TCP、UDP,以及多路復用的系統調用select/poll/epoll的差別。
《TCP/IP詳解 卷1:協議》- 這是一本看完後你就可以當網路黑客的書。了解乙太網的的運作原理,了解TCP/IP的協議,運作原理以及如何TCP的調優。
實踐任務:
理解什麼是阻塞(同步IO),非阻塞(非同步IO),多路復用(select, poll, epoll)的IO技術。
寫一個網路聊天程序,有聊天伺服器和多個聊天客戶端(服務端用UDP對部分或所有的的聊天客戶端進Multicast或Broadcast)。
寫一個簡易的HTTP伺服器。
《Unix網路編程卷2,進程間通信》信號量,管道,共享內存,消息等各種IPC…… 這些技術好像有點老掉牙了,不過還是值得了解。
實踐任務:
主要實踐各種IPC進程序通信的方法。
嘗試寫一個管道程序,父子進程通過管道交換數據。
嘗試寫一個共享內存的程序,兩個進程通過共享內存交換一個C的結構體數組。
學習《Windows核心編程》一書。把CreateProcess,Windows線程、線程調度、線程同步(Event, 信號量,互斥量)、非同步I/O,內存管理,DLL,這幾大塊搞精通。
實踐任務:使用CreateProcess啟動一個記事本或IE,並監控該程序的運行。把前面寫過的那個簡易的HTTP服務用線程池實現一下。寫一個DLL的鉤子程序監控指定窗口的關閉事件,或是記錄某個窗口的按鍵。
有了多線程、多進程通信,TCP/IP,套接字,C++和設計模式的基本,你可以研究一下ACE了。使用ACE重寫上述的聊天程序和HTTP伺服器(帶線程池)
實踐任務:通過以上的所有知識,嘗試
寫一個服務端給客戶端傳大文件,要求把100M的帶寬用到80%以上。(注意,磁碟I/O和網路I/O可能會很有問題,想一想怎麼解決,另外,請注意網路傳輸最大單元MTU)
了解BT下載的工作原理,用多進程的方式模擬BT下載的原理。
3、系統架構
負載均衡。HASH式的,純動態式的。(可以到Google學術里搜一些關於負載均衡的文章讀讀)
多層分布式系統 – 客戶端服務結點層、計算結點層、數據cache層,數據層。J2EE是經典的多層結構。
CDN系統 – 就近訪問,內容邊緣化。
P2P式系統,研究一下BT和電驢的演算法。比如:DHT演算法。
伺服器備份,雙機備份系統(Live-Standby和Live-Live系統),兩台機器如何通過心跳監測對方?集群主結點備份。
虛擬化技術,使用這個技術,可以把操作系統當應用程序一下切換或重新配置和部署。
學習Thrift,二進制的高性能的通訊中間件,支持數據(對象)序列化和多種類型的RPC服務。
學習Hadoop。Hadoop框架中最核心的設計就是:MapRece和HDFS。MapRece的思想是由Google的一篇論文所提及而被廣為流傳的,簡單的一句話解釋MapRece就是「任務的分解與結果的匯總」。HDFS是Hadoop分布式文件系統(Hadoop Distributed File System)的縮寫,為分布式計算存儲提供了底層支持。
了解NoSQL資料庫(有人說可能是一個過渡炒作的技術),不過因為超大規模以及高並發的純動態型網站日漸成為主流,而SNS類網站在數據存取過程中有著實時性等剛性需求,這使得目前NoSQL資料庫慢慢成了人們所關注的焦點,並大有成為取代關系型資料庫而成為未來主流數據存儲模式的趨勢。當前NoSQL資料庫很多,大部分都是開源的,其中比較知名的有:MemcacheDB、Redis、Tokyo Cabinet(升級版為Kyoto Cabinet)、Flare、MongoDB、CouchDB、Cassandra、Voldemort等。
『捌』 程序員從15歲開始學習晚嗎
你好!程序員從15歲開始學習不算晚,只要自己對他有興趣愛好,喜歡他就堅持做一下,一定會有收獲的。
就目前而言學習軟體專業是一個不錯的選擇,只要跟著老師或者指定詳細的學習路線並堅持下去。這專業會學習以下語言:C,JAVA,PHP,PYTHON,MYSQL,JAVASCRIPT另外就是各個語言的框架,提高開發速度的。下面是跟數據相關的知識。
數據的連接首先需要載入一個代碼塊。如果 chunk 是一個字元串,代碼塊指這個字元串。如果 chunk 是一個函數, load 不斷地調用它獲取代碼塊的片段。 每次對 chunk 的調用都必須返回一個字元串緊緊連接在上次調用的返回串之後。 當返回空串、nil、或是不返回值時,都表示代碼塊結束。
1.如果沒有語法錯誤, 則以函數形式返回編譯好的代碼塊;否則,返回 nil 加上錯誤消息。
如果結果函數有上值, env 被設為第一個上值。 若不提供此參數,將全局環境替代它。 所有其它上值初始化為 nil。 (當你載入主代碼塊時候,結果函數一定有且僅有一個上值 _ENV ))。 然而,如果你載入一個用函數(參見 string.mp, 結果函數可以有任意數量的上值) 創建出來的二進制代碼塊時,所有的上值都是新創建出來的。 也就是說它們不會和別的任何函數共享。
2.接下來就是根據以上信息進行下面的操作,chunkname 在錯誤消息和調試消息中,用於代碼塊的名字。 如果不提供此參數,它默認為字元串chunk 。 chunk 不是字元串時,則為 "=(load)" 。
3.Lua 不會對二進制代碼塊做健壯性檢查。惡意構造一個二進制塊有可能把解釋器弄崩潰。
運行程序來遍歷表中的所有域。 第一個參數是要遍歷的表,第二個參數是表中的某個鍵。 next 返回該鍵的下一個鍵及其關聯的值。 如果用 nil 作為第二個參數調用 next 將返回初始鍵及其關聯值。 當以最後一個鍵去調用,或是以 nil 調用一張空表時, next 返回 nil。 如果不提供第二個參數,將認為它就是 nil。 特別指出,你可以用 next(t) 來判斷一張表是否是空的。
索引在遍歷過程中的次序無定義, 即使是數字索引也是這樣。 (如果想按數字次序遍歷表,可以使用數字形式的 for 。)
4.當在遍歷過程中你給表中並不存在的域賦值,next的行為是未定義的。然而你可以去修改那些已存在的域。 特別指出,你可以清除一些已存在的域。
如果 t 有元方法 __pairs, 以 t 為參數調用它,並返回其返回的前三個值。
否則,返回三個值:next 函數, 表 t,以及 nil。
5.傳入參數,以 保護模式 調用函數 f 。這意味著 f 中的任何錯誤不會拋出;取而代之的是,pcall 會將錯誤捕獲到,並返回一個狀態碼。 第一個返回值是狀態碼(一個布爾量), 當沒有錯誤時,其為真。 此時,pcall 同樣會在狀態碼後返回所有調用的結果。 在有錯誤時,pcall 返回 false 加錯誤消息。
希望能幫到你,謝謝!