心之所向,百炼成钢 第一章

来源:互联网 发布:windows iso下载地址 编辑:程序博客网 时间:2024/05/03 21:34

前言

20160709踏上扬州,20170826奔向武汉。在过去的1个半月实习前的培训中,有得有失。

在写这一篇文章的时候,我极力想摆脱实习报告的套路,想要言简意赅。少写一些空乏的琐事,多一些知识的干货。在经过扬州的1个半的培训中。我知道了自己的路,我不愿自己的未来随风随浪,漂浪东西,亲像船无港。

我是一名实习的java码农,但是我希望未来的我是XX产品的开发者。在过去扬州的培训中,分别学习了java.Net。所以我会后续的5篇实习报告中(加上这一篇,一共是6篇)去回顾我过去学习的知识。温故而知新,可以为师矣。

我觉得有一句话,说的挺不错的。”学而不思则罔,思而不学则殆”。这很符合程序员的学习方法。同样是相同经验的程序员,有的程序员技术烂,有的程序员技术很厉害。合理的总结过去学习的知识和举一反三无非可以增加学习的效率,我觉得这是优秀的程序员和普通的程序员之间的分水岭。


Daily Report

在扬州实习中,我们每天都要写一篇日报去简要的描述今天做了什么,完成的进度是什么,遇到了什么问题,可以提出自己对课程的意见,明天应该完成什么。

但是听到这个要求,我内心的想法:”我曹,这么傻逼,完全多此一举,没有任何意义啊。”现在的我发现当时的我真的很无知。而且daily report不是用中文写,是全英文。

具体的格式精确到每一个空格和标点符号,标题要加粗,整个字体是用Arial字体,字体的size10pt,标题和内容之间要空一格。标题符号要用半角,不能用全角。写英文要注意时态,专业术语要大小写。

就是这么简单的daily report,我们培训的60个人第一天没有人能写出符合要求的daily report,就算trainer给我们每天讲格式要求。就是这样的前提下,过去了一个星期,60个人中寥寥无几能写出符合要求的report

到现在为止,我都不能保证我写的英文句子满足时态,大小写,语句结构没问题等这些要求,我也只会写一些to do, learn, study, understand, finish这些简单的语句去描述我当天做了什么,因为英语太烂了,写复杂的句子免不了出错,所以就写很简单的句子。

记得trainer跟我们说过:”你们连这么简单的daily report都完成不了,还指望你们写出质量高的code“。现在想想,说的还真没错。细节决定成败。


Coding style

现在的很多公司开发项目都是以敏捷开发的模式对产品去进行开发。敏捷开发是以用户的需求进化为核心,采用迭代,循序渐进的方法进行软件开发。团队合作在这一环节肯定是少不了,尽然团队合作了,就少不了merge代码。

为了加快团队合作开发的效率,很多公司都会制定出一套Coding Style。让团队的代码风格保持一致。当我一开始去学习本公司的Coding Style,简直生不如死啊。以前在学校写代码保持一贯的野路子风格,毫无风格而言。导致代码阅读性很差。以前代码是这样写的,我自己都看不下去的。

public class QuickSort {    public static void sort(int[] number){        sort(number,0,number.length-1);    }    private static void sort(int[] number, int left, int right) {        // TODO Auto-generated method stub        if(left<right){            int i=left,j=right;            int x=number[left];            while(i<j){                //死循环, 只有比x小的元素才能跳出循环 从右到左                while(i<j&&number[j]>=x){                    j--;                }                if(i<j){                    number[i++]=number[j];                }                //大于x的元素才能跳出循环                while(i<j&&number[i]<=x){                    i++;                }                if(i<j){                    number[j--]=number[i];                }            }            //如果i==j的话就会跳出循环, 然后以i为分界线,左边比i小,右边比i大            //然后我们把左边的元素和右边的元素递归调用,重复以上操作            number[i]=x;            sort(number,left,i-1);            sort(number,i+1,right);        }    }    public static void main(String[]args){        int[] num={34,1,23,345,12,546,131,54,78,6543,321,85,1234,7,76,234};        sort(num);        for(int i=0;i<num.length;i++){            System.out.println(num[i]);        }    }}

现在的我,代码是这样写的

public class LinkedListCreator {    private int count;    /**     * Creates a linked list     * @param data the data to create the list     * @return head of the linked list.The returned linked list     * ends with last node with getNext() == null     */    public Node createdLinkedList(List<Integer> data) {        count ++;        if (data.isEmpty()) {            return null;        }        System.out.println("list = " + data.toString());        Node firstNode = new Node(data.get(0));        System.out.println("before count=" + count + ",value=" + firstNode.getValue());        Node headOfSublist = createdLinkedList(data.subList(1, data.size()));        System.out.println("after count=" + count + ",value=" + firstNode.getValue());        firstNode.setNext(headOfSublist);        return firstNode;    }    public static void main(String[] args) {        LinkedListCreator creator = new LinkedListCreator();        Node.prinfLinkedList(creator.createdLinkedList(new ArrayList<Integer>()));        Node.prinfLinkedList(creator.createdLinkedList(Arrays.asList(1)));        Node.prinfLinkedList(creator.createdLinkedList(Arrays.asList(1, 2, 3, 4, 5)));    }}

聪明的人立马看出了之间的区别。首先是注释,注释真的很重要,注释去描述你这个方法具体干了什么的事情,尽量的去描述的清楚。不然以后进了项目,免不了团队合作。如果你不写注释,小心别人问候你全家。

我以前写代码通常是不加注释的,觉得注释可有可无。但是在项目中,效率为前提。优雅的注释,会方便团员去了解你代码的logic。像我之前去看一个项目的源码时候,云里雾里,因为作者加的注释很少很少!!!!!!!看的我生不如死啊,所以我以后写code的时候会加上注释,我体会过那种生不如死的感受。

其次,注释不要出现中文,全英文注释。如果你想成为一名大牛,从书写优雅的英文注释开始。还有一点就是,写中文和英文的时候,输入法频繁的切换,有点影响效率。但是主要的原因还是国际化,编码方面的第一手资料永远是英文,中文文档基本上是二手资料。所以你懂,学好英文真的很重要。

现在的我英文词汇比以前增加不少了,逛一下StackOverflow,还是Ok的。平时和团员用的skype,基本上也是英文交流,在扬州做training的时候,每天会给我们half an hour让我们去交流英文,谈一下话题。

继续回到CodingStyle的话题上
* 首选如果一个类只有方法,而没有成员变量的话,方法和类之间要空一行。如果有成员变量和方法,那么成员变量和方法之间要空一行,而成员变量不用空。比如一个类是这样的public class A{},那么最后的}这个括号后面要控一行。因为String这个类就是这样写的,别问为什么。

  • 静态变量全大写,成员变量小驼峰,方法小驼峰,类大驼峰,tab缩进换4个点,显示代码的行数和white space,方法空4个点,cssjs也是具体到空几个点。ifwhile等语句前面要空一行, return x, 如果x为空的话,那么前面不用空一行,如果不为空的话,那么要空一行。

  • cssjs的命名规则是a-b-c, htmljsp的命名规则是a_b_c, hard code一律提取到Constant类中,要进行分块。相同的代码出现2次,要考虑到设计模式,进行抽取分离,达到公用。

  • 涉及到数据库的,尽量不要用sql语句,要使用存储过程。model层的代码字段要和数据库表的列表一一对应起来,数据库命名规范a_b_chtmljsp标签要闭合,cssjs抽取到js文件夹下面的文件中。

  • 前台代码和后端代码进行动静分离。前台只显示静态的标签,相关逻辑render to desgin放到js中去完成。画前台UI尽量不要使用position:relative或者absolute,这一点我其实也不知道为什么,哈哈哈哈。

相关的Coding Style就说到这里了,因为实在太多了,要知道Coding Style文档有中涉及到的规范很多,这里的篇幅说不完!!!。

未完待续,下一篇待续。附上3张在扬州实习图

扬州5点30的时候

第一天培训的时候

某一天培训的早晨

原创粉丝点击