程序员是一个手艺活,虽说有人把学习归纳出自然主义和结构主义学习。
自然主义一般是以模仿的方式慢慢地对事物达成一种熟悉地认知,如语言,乐器等。
结构主义是以结构和交互关系为中心,以体系化学习为主,寻找到底层逻辑,以创造为目的。如医药学、经济学、计算机科学的学习。
但是所有的事情第一出发点都是动手,只有动手之后才会有对事物的感知。如在编程领域,初学者对代码设计,看10遍设计模式,不如自己思考之后动手模仿某种设计模式的代码实现某个业务场景来的直接和感触深刻。这种感触会更进一步的促使自己去认知这这种设计的利弊,从而提高对代码的审美。而不是枯燥的停留在书面的思考,强压着内心某种反抗强行学习状态。
学习任何东西,我觉得都是有规律可循的。正常的人都不傻,有一句话怎么说来着:“以大多数人努力程度之低,远远不到拼天赋的时候”。从这个思考角度出发,这么去理解这句话我觉得更为贴切——“对于大多数职业的胜任,远远还不到天赋这个层面”。
学习更多的是一个突破口/接入点的问题,这可能是别人说的开悟的过程。上学时期那些成绩好的同学在他的成长过程中我相信一定存在某个契机点(在此我为什么说是契机点而不是突破口/接入点,因为那会绝大多数人都不是自发的寻找到的,更多的是某个契机,条件好的或是长辈的培养),让他觉得自己“原来”比别人做的好,可以胜任这门学科。从而产生“兴趣”(兴趣可能就是来自外界的肯定,也不是真对这门学科的内容感兴趣),进入良性循环。
我们成人在进入某个领率的学习时更应该是需要自身去寻找一个突破口/接入点。比如上面的说的,当我们大多数程序员都在面对过程,面对方法栈编程的时候,通过模仿设计模式为接入点所产生的“成就感”从而促使自己了解更多的编程思想,当初期的雪球成型,之后就是时间的问题了。比如我自己在学拍照片这个过程中,出发点当然是想自己拍婚纱照,自己旅拍。过程中我会找一些摄影社区,大量地看图片,然后把自己地作品上传上去,只要有人给我点赞,我就会更加对自己肯定。通过各种途径找到摄影社区,群里发自己拍地照片,通过别人地点评去琢磨有哪些不足和如何改进,慢慢地就会有自己地风格和理解。
兴趣是最好的老师,其次是耻辱。去面试,你就知道当你在看书籍和文档时候不求甚解时下场。
念念不忘必有回响,心心念的某个知识点理解不上来,一定会在今后的某个其他知识点的学习中解开。
保持熟悉度。理解基本的概念,各种模型、协议的概念,数据结构,算法,并保持熟悉度,时不时的回顾。
如下是今天对基本算法的练习:
private void selectSort(int[] numbers) {
for (int i = 0; i < numbers.length -1; i++) {
for (int i1 = i + 1; i1 < numbers.length; i1++) {
if (numbers[i] > numbers[i1]) {
swap(numbers,i,i1);
}
}
}
}
private void insertSort(int[] numbers) {
for (int i = 1; i < numbers.length; i++) {
int tmp = numbers[i];
int j = i - 1;
while(tmp < numbers[j]){
numbers[j + 1] = numbers[j];
if (--j == -1) {
break;
}
}
numbers[j + 1] = tmp;
}
}
private void bubbleSort(int[] numbers) {
for (int i = 0; i < numbers.length - 1; i++) {
for (int i1 = 0; i1 < numbers.length - i - 1; i1++) {
if (numbers[i1] > numbers[i1 + 1]) {
swap(numbers,i1,i1+1);
}
}
}
}
private void quickSort1(int[] numbers,int left,int right) {
if (left >= right) {
return ;
}
int tmp = numbers[left];
int i = left;
int j = right + 1;
while(true) {
while(i+1 < numbers.length && numbers[++i] < tmp){};
while(j-1>-1 && numbers[--j] > tmp){};
if (i >= j) {
break;
}
swap(numbers,i,j);
}
numbers[left] = numbers[j];
numbers[j] = tmp;
quickSort1(numbers,left,j-1);
quickSort1(numbers,j+1,right);
}
private void swap(int[] number,int i ,int j) {
int tmp = number[i];
number[i] = number[j];
number[j] = tmp;
}