• why you write code so slow.


    今天我们要写一个日历表,用以存储所有的节假日。

    虽然这个表设计的并不是很妙。但是将就着继续了。

    让小弟把该表数据初始化3-5年的,结果一上午还没有出来,着急了,自己写了一个初始化的工具。

    分享出来。

     1 import java.util.Calendar;
     2 
     3 
     4 public class CalendarApp {
     5 
     6     
     7     String [] holidays = new String[]{"2013-10-01","2013-10-02","2013-10-03","2013-10-04", "2014-10-01","2014-10-02","2014-10-03","2014-10-04"};
     8     String [] workdays = new String[]{"2013-09-30"};
     9     
    10     public boolean isHoliday(int year, int month, int day) {
    11         String date = padding(year,4) +"-"+ padding((month+1), 2) +"-" + padding(day, 2);
    12         for (String d : holidays) {
    13             if(d.equals(date)) {
    14                 return true;
    15             }
    16         }
    17         return false;    
    18     }
    19 
    20     private String padding(int number, int length) {
    21         String text = String.valueOf(number);
    22         for (int i = length ;  i > text.length(); i--) {
    23             text = "0" + text;
    24         }
    25         return text;
    26     }
    27 
    28     public boolean isWorkDay(int year, int month, int day) {
    29         String date = padding(year,4) +"-"+ padding((month+1), 2) +"-" + padding(day, 2);
    30         for (String d : workdays) {
    31             if(d.equals(date)) {
    32                 return true;
    33             }
    34         }
    35         return false;    
    36     }
    37     
    38     public boolean isWeekend(int year, int month, int day) {
    39         Calendar cal = Calendar.getInstance();
    40         cal.set(Calendar.YEAR, year);
    41         cal.set(Calendar.MONTH, month);
    42         cal.set(Calendar.DATE, day);
    43         int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
    44         return dayOfWeek > 4;    
    45     }
    46 
    47     private boolean isDate(int year, int month, int day) {
    48         Calendar cal =  Calendar.getInstance();
    49         cal.set(Calendar.YEAR, year);
    50         cal.set(Calendar.MONTH, month);
    51         cal.set(Calendar.DATE, day);
    52         int y = cal.get(Calendar.YEAR);
    53         int m = cal.get(Calendar.MONTH);
    54         int d = cal.get(Calendar.DATE);
    55         return year == y && month == m && day == d;
    56     }
    57     
    58     public boolean calc(int year, int month, int day) {
    59         String date = padding(year,4) +"-"+ padding((month+1), 2) +"-" + padding(day, 2);
    60         System.out.println(date);
    61         if(isWeekend(year, month, day) ){
    62             if(isWorkDay(year, month, day)){
    63                 return false;
    64             }
    65             return true;
    66         } else {
    67             if(isHoliday(year, month, day) ){
    68                 return true;
    69             }
    70             return false;
    71         }
    72     }
    73     
    74     public static void main(String[] args) {
    75         CalendarApp app = new CalendarApp();
    76         for (int year = 2013; year < 2016; year ++) {
    77             for (int month = 9;month<10;month++) {
    78                 for (int day=1; day<32;day++) {
    79                     if (app.isDate(year,month, day)) {
    80                         boolean vacation = app.calc(year, month, day);
    81                         CompanyCalendar comCal = new CompanyCalendar(year, month, day, vacation);
    82                         comCal.save();
    83                     }
    84                 }
    85             }
    86         }
    87     }
    88 }


     这段代码大概用了20分钟写完的。

    但是好几个人在写这个功能的时候用的时间都要远远长于这个时间。

    那么我们就来分析一下为什么大家写代码会慢。

    1. 整理思路

        有这样一种工作方式:在写代码之前先要整理思路,在纸上描来画去,当思路清晰之后才开始写代码。

        这个思考的过程占去了一部分时间。

       (难道这个时间可以节省吗?慢慢来,往下看。)

    2. 敲击键盘的方法

       不熟悉键盘,不熟悉IDE,都是效率的杀手。写的时候还要自己输入Tab或者空格来对齐。

       这些都会造成时间的浪费。

      (这也太狗血了吧。不过的确很现实)

    3. 不熟悉API

       由于对于API的熟悉程度不够,有些东西要重新发明轮子,有些东西要绕弯路,这些也是时间浪费的元凶之一。

       (这个的确是,但是这个得靠经验吧。嗯,差不多是这样,但是可以问啊。)

       时间飞逝。

    4. 方法总是在变

       思路不固定,写的时候发现,这儿不好,那儿不行,这里要改进,那里要完善,于是,在反反复复中度过了很多时间。

       (那发现错了还不改吗?得改,但是别改来改去又改回来,犹豫是大敌)

       犹豫来犹豫去,时间就没了。

    5. 寻找捷径

        有些时候回想,会不会有捷径能够完成这个任务呢,也许真的有,但是如果知道有,马上可以用那就用。

       如果不知道,或者需要查很久,那么何不先直接写下来一个比较笨的,然后再改进呢?

        寻找捷径的时间比正常笨办法走过去的时间还要长。

    6. 不会用搜索引擎

       (别搞笑了,写代码,和搜索引擎有什么关系?)

        哇哦,那你不会的时候怎么办?是不是要搜索。(哦)

        可是你输入的是什么关键词?你得到的答案有多少是可用的,又有多少页面给出了答案了呢?

       宝贵的时间就在低效的搜索中度过了。

    7. 不会Debug

        不会Debug,断点设置了一大堆,但是没有几个是有用的,结果每次执行都要被打断,打断再打断。

        还不如插个Log快呢。

        时间就这么滑过去了。

    8. 不会用测试

        不会测试,采用System.out.println然后肉眼观察。

        其实,JUnit一个TestCase可能就搞定了。

        而且在跟踪的时候不会用Log,输出的内容总是不在点上。

        很多时间就不过去了。

    宝贵的时间就这么流逝了。

    这就是你写代码变慢的几个常见的原因。

    那么怎么解决呢? 好的,我们来看看怎么才能够加快写代码的速度。

    1. 去掉纸上设计

       纸上设计的最大问题在于,你没办法校验设计的正确性。即使UML工具也没办法告诉你可能出现编译错误、逻辑错误。

       那怎么办?答案就是去掉纸上设计。难道一点设计都没有写代码能够可靠吗?

       那如果你听过极限编程(XP)那你就一定会知道,有那么一小撮人,写代码真的没有设计。

       没有设计听起来天方夜谭。实际上并不是没有设计,而是进行最简单的设计,简单的模型,就开始编码,让IDE告诉程序员,

       哪个地方编译不通过,哪个地方逻辑复杂度偏高,哪里会出现重复...

       然后利用重构工具,将这些代码一一改过来。

       逐步的就形成了正确的设计,这就是演进式设计。由于直接写的是可以工作的代码,所以,节省了大量的时间。

    2. 熟记快捷键,利用IDE特性

       IDE会帮助你格式化代码,无需一个个的Tab去敲。

       IDE会帮助你重构,而无需用检索 -> 替换,那有可能让你替换了不该替换的代码。

       IDE会帮你快速定位代码,而不需要连续按动上下箭头,或者是拉动滚动条。

       .一下就会告诉你这个对象可以有哪些变量供访问,哪些方法供调用。

    3. 熟记常用API

        常用的API需要熟记,这样才能够信手拈来。

        比如,如何从一堆数据中过滤出来符合条件的数据,可能是采用lambda表达式最好。

        如果无法用lambda表达式,那么试试CollectionUtils。

        重新发明轮子可能不仅仅是造成时间浪费,有时候还会引入Bug。 

    4. 学会用搜索引擎

        当你想要寻找捷径的时候,问问搜索引擎。

        当然你得学会如何利用关键词提高搜索出答案的概率。你也得了解哪些网站会给你正确的答案,而哪些网站,问了也不会有下文。

        最好的搜索引擎恐怕就是你的QQ群,微博上关注的某几个高手。但是高手未必有时间来回答你的问题,所以你可能会感到不好意思。

        那么,一次生两次熟,问问高手如何思考,如何搜索,你就会逐步的学会。

        不耻下问,上问也不必羞。

    5. 改变思路,另辟蹊径

        也许一个Java问题困惑了你很长时间,但是SQL可能马上就可以解决。

        也许一个List需要很长的循环才能搞定的事情,Map只需要3-5行。

    6. 停止Debug

       我很少见到人用Debug工具很高效的。采用Debug Log,它不会让你的程序断,也不会让你在大脑里记忆很多东西。

       它很连贯,但是要善于写Log。

    7. Test Automation

       毋庸置疑,如果写完了代码有一个事物会告诉你正确了——那它一定是自动测试工具。

       写测试吧。磨刀不误砍柴工。

  • 相关阅读:
    day10servlet编程
    day9http协议
    day8 服务器
    day4 DOM,BOM
    k均值
    asp.net mvc 下拉列表
    asp.net mvc  Ajax.BeginForm 异步上传图片的问题
    sqlserver 存储过程 游标实例
    中篇: php 微信支付 基于Thinkphp3.2开发
    下篇: php 微商城 基于Thinkphp3.2框架开发
  • 原文地址:https://www.cnblogs.com/stephen-wang/p/3385770.html
Copyright © 2020-2023  润新知