‘壹’ 嵌入式硬件工程师和软件工程师都有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 加错误消息。
希望能帮到你,谢谢!