悠然 17:47:43
路人甲,速度报到领取任务了。
悠然 20:01:28
今天完成200行代码,呵呵,完不成,淘汰:)
悠然 20:02:11
http://git.oschina.net/tinyframework/tiny.git
悠然 20:02:20
https://git.oschina.net/tinyframework/tiny/fork
悠然 20:02:26
去fork一下。
路人甲 20:02:44
好
悠然 20:03:10
然后把自己fork下的代码clone下来。
悠然 20:03:38
对应的找到https://git.oschina.net/tinyframework/tiny/tree/master/framework/org.tinygroup.dbf
悠然 20:03:42
这个目录。
悠然 20:04:01
这个里面大概有300多行代码,完成了dbf文件的读取。
悠然 20:04:14
你的任务是完成另外的200多行代码,完成对应DBF文件的写入。
悠然 20:04:28
要求,代码风格与原来大体一致。
路人甲 20:05:00
嗯,我尝试一下
悠然 20:05:09
呵呵,今天完不成,明天完成也算完成任务。
悠然 20:05:18
明天完不成,后天完成也算完成。
悠然 20:05:58
今天完成,架构师;明天完成,高级程序员;后天完成;中级程序员,大后天完成:初级程序员。
悠然 20:06:04
悠然 20:06:07
公平吧?
悠然 20:06:22
大后天完不成,就out了:)
路人甲 20:07:22
收到。
悠然 20:07:38
悠然 20:08:56
路人甲 9:17:14
悠然 9:17:55
??
悠然 9:18:00
这么开心的?
路人甲 9:18:05
我可以说我完成了么?
悠然 9:18:29
悠然 9:18:42
呵呵,热烈欢迎。
悠然 9:19:00
呵呵,如果完成了且没啥问题,我兑现给你架构师。
路人甲 9:19:48
呵呵,回头你先看看代码。主要的文件格式应该是没有什么问题了。我写入的,用之类的读的功能,是可以读取的
悠然 9:20:10
悠然 9:20:16
pullrequest给我。
路人甲 9:20:26
嗯,我先吃个早饭
悠然 9:26:21
悠然 9:26:46
吊我胃口。
路人甲 9:27:24
我来弄一下。
路人甲 9:51:35
我提交了代码,要点一下pull requests是吧
悠然 9:52:27
嗯嗯。
路人甲 9:55:20
我操作完成了
路人甲 9:55:22
悠然
悠然 9:55:58
悠然 9:56:34
悠然 9:58:26
呵呵,好像规定的200行也没有超过哦。
路人甲 10:04:04
我完成的比较仓促。。有不足的地方。还希望提出
写的时候,我把数据先放内存,最后写文件的。所以没有用nio
悠然 10:04:35
Writer接口为啥没有内容??
路人甲 10:05:08
我应该把抛出来用的方法声明在接口里,
悠然 10:05:36
否则这接口的作用就降低了。
悠然 10:05:53
编译采用jdk1.5兼容要求。
悠然 10:06:01
否则在jdk1.5就没法跑了。
悠然 10:06:32
headbuffer.write(new byte[]{ //年月日
0x72,0x07,0x07
});
悠然 10:06:39
悠然 10:06:48
这个要读取当前日期的。
悠然 10:06:52
你给填了固定值。
悠然 10:07:54
悠然 10:08:08
这个命名不规范,应该是写入一行的意思吧?
悠然 10:08:29
writeRecord和writeData表达的意思是不一样的。
路人甲 10:09:18
嗯
悠然 10:10:08
悠然 10:10:25
变量名尽量用长名。
路人甲 10:10:39
悠然 10:10:52
悠然 10:11:02
这个地方,引用in的意义在于?
路人甲 10:11:55
因为我定义字长是4位
路人甲 10:12:10
如果需要2位的或者3位的
路人甲 10:12:26
我会把4位拷贝到指定长度的数组中
路人甲 10:12:34
悠然 10:12:44
嗯嗯,这个应该改成两方法。
悠然 10:12:56
一个是int转成4个长的方法。
悠然 10:13:05
另外一个是截取部分长度的方法。
悠然 10:13:45
悠然 10:14:43
writeByteArray
悠然 10:14:58
这个的函数名定义是不是也不准确??
悠然 10:15:12
这里是输出一个字段定义吧?
路人甲 10:15:15
嗯
路人甲 10:15:39
改,这方面的确不规范
悠然 10:17:16
亲,做平台与做项目的区别在于:
悠然 10:17:28
做项目,没有人能看得到你表现不好的地方。
悠然 10:17:44
所以,你猥琐一点实现就实现了,没啥关系。
悠然 10:18:09
做平台就完蛋了,你猥琐一下,完了,还不能改,因为有人用了。
悠然 10:18:25
完了,每次被人发现,都会被人鄙视。
悠然 10:18:30
路人甲 10:18:55
嗯。我了解了,下回就会注意这些
悠然 10:22:51
修改完了之后,再提交给我。
路人甲 10:23:04
嗯
悠然 10:23:36
呵呵,因此就算你今天完成,给你高级程序员称谓了哦:)
悠然 10:25:03
架构师和高级程序的差别,其实也就差这么一点:
1.更细致
2.更严谨
3.不仅仅是以实现功能为目标
路人甲 10:25:39
嗯,
悠然 10:29:19
我要离开一下,你要严格要求自己,完了觉得没有更好的程度,再提交后推送我。
路人甲 10:29:53
好的
悠然 10:30:17
根据这个看,你是一个反应敏捷的程序员。
悠然 10:30:32
但是可能随项目做的比较多,导致有点随意了。
悠然 10:31:14
呵呵,简单注意一点就好了。
路人甲 10:31:32
悠然 12:37:42
路人甲!!!
路人甲 12:37:54
?
悠然 12:38:36
呵呵,pull了没?
路人甲 12:39:42
还没有,上午没有弄。我下班之前提交给你
悠然 12:40:04
感觉你分分种就可以搞定的。
路人甲 12:40:41
上午在部署几个东西。
路人甲 12:40:54
坐在这儿,事就来,杂呀。
悠然 12:42:09
路人甲 15:44:09
悠然,我pull给你了
早上说的那些细节我修改了一下
完善了一些忽略掉的逻辑
悠然 17:17:25
嗯嗯。
悠然 17:17:38
这样就对了,好呆让我挑出点毛病,有点成就感么:)
悠然 17:19:35
路人甲,在??我回来了。
路人甲 17:19:42
在了
悠然 17:19:57
刚才出去到客户那里去了。
路人甲 17:20:12
悠然 17:20:20
首先回答个问题,你自己觉得这次提交的有啥遗憾或不足没?
路人甲 17:21:34
我暂时没想,但是我存在一些疑惑
悠然 17:22:02
请讲?
路人甲 17:22:02
比如,对dbf的文件的写入,目前只有整个文件的写入
路人甲 17:22:28
那么如果对于个已存在的文件,想做局部的删改
路人甲 17:22:36
是不是也在预期之内的功能
路人甲 17:23:09
还有,我看你读的时候,把数据,只当字符串来解析,dbf文件的其它数据类型是不是不用关心
悠然 17:23:14
呵呵,也要全读出来,再修改了之后再写入,是吧?
悠然 17:23:32
现在需要idx文件的,暂时不用关心。
悠然 17:24:37
你没有考虑删除标记的?
路人甲 17:25:04
写入的时候有删除标记?
悠然 17:25:33
就是有的记录有删除标记。
悠然 17:27:42
悠然 17:27:50
读取的时候,明显是有处理的。
路人甲 17:28:14
额,可能我对这个功能的使用背景还不太了解。
我想如果预期是删除的,那么为什么还要往里写呢。
悠然 17:28:58
呵呵,如果删除了,写入,下次要用,只要把删除标志置一下就回来了。
悠然 17:29:11
如果直接不写入,下次想后悔就没有了。
悠然 17:29:53
和你说,要改成jdk1.5兼容,你没有改。
悠然 17:31:23
悠然 17:31:38
这个方法,可以优化为没有arrayCopy的。
路人甲 17:31:50
额。。我用了jdk1.5不支持的东西呀。。
我早上没注意到这句话。jdk1.5我还没用过
悠然 17:31:58
理论上性能好一点:)
悠然 17:32:10
悠然 17:32:17
这个东东,jdk1.5不支持。
悠然 17:32:44
我的框架要求支持jdk1.5和1.6两个版本。
悠然 17:32:55
说错了,支持jdk1.5以上版本。
路人甲 17:32:55
嗯。我知道了
路人甲 17:33:10
刚才那个问题。我想讨论一下
悠然 17:33:35
嗯嗯,请讲。
路人甲 17:34:26
arraycopy拷贝内存比一些cpu的数学计算来说,
悠然 17:34:56
??是不是打错字了?
路人甲 17:36:01
没有,我早上看到你说的了,但是我认为arraycopy的方案,要比之前实现的那一版,要好一些。
悠然 17:37:19
嗯嗯,我是说,如果从代码优化的角度还可以更优化。
悠然 17:37:38
你知道bit
悠然 17:37:44
就知道数据开多长。
悠然 17:37:56
然后按长度赋值进去,直接返回就好了。
悠然 17:38:06
无法是多了3个判断。
悠然 17:38:34
3个判断与多赋值的语句,对比成本已经接近。
悠然 17:38:42
但是现在多了一次arrayCopy
悠然 17:39:21
要申请两次空间,还有数据拷贝。
悠然 17:39:26
比如,bit=2
悠然 17:39:58
你先申请了4bytes,然后四4赋值,然后又进行arrayCopy
悠然 17:40:32
如果写成byte[]buf=new byte[bit];
路人甲 17:41:09
嗯。我明白你的意思了
悠然 17:41:37
单就这个问题来说,你性能下降一倍多。
悠然 17:41:57
垃圾回收次数增加一倍多。
悠然 17:42:04
如果有的话。
悠然 17:42:48
悠然 17:42:56
这种尽量就用field吧。
悠然 17:43:04
i,j除外。
路人甲 17:43:13
嗯
悠然 17:43:26
这个是可以接受的。
悠然 17:43:33
Field f是要避免的。
悠然 17:43:48
i一般约定俗成为表示索引下标。
悠然 17:43:52
所以,可以用。
路人甲 17:43:54
嗯
悠然 17:44:04
但是如果Field f,这个就难以理解了。
路人甲 17:44:08
我刚才想说啥来着
路人甲 17:44:13
还有一个问题
悠然 17:44:31
想说,arrayCopy那个方法,我为啥说你还有优化空间了。
路人甲 17:45:13
对了,util里。我把那个*256的改成位移了。动了原来的东西
悠然 17:45:29
没关系,改得好都接受。
悠然 17:45:37
改不好,就不接受:)
悠然 17:46:03
所有的都可以改---只要改得好。
路人甲 17:46:20
变量名的问题,我刚才改完后还检查了一遍,还有这个问题。太粗心了
悠然 17:46:22
知道为什么让你做个小例子了吧?
悠然 17:46:32
因为不同的项目组,规范不一样的。
路人甲 17:47:03
嗯,我向来单打斗独。。所以这次机会,我很珍惜
悠然 17:47:08
我眼睛像素级的。
悠然 17:47:25
不管是拼写错误,逻辑错误,漏网的不多。
悠然 17:47:36
嗯嗯,所以,对你是机遇也是挑战。
悠然 17:48:04
机遇,是有新东西学习,挑战是你要和你自己做斗争。
悠然 17:48:23
但是请相信我,如果你做得好,我们会向你学习的:)
悠然 17:48:41
同理,你原来养成的“坏”习惯也得改改。
悠然 17:49:53
悠然 17:50:05
这个args,没有人会知道怎么填的。
路人甲 17:50:27
嗯呐。
悠然 17:51:14
byte[] fillbank = new byte[needFillLength];
for(int j = 0;j<needFillLength;j++) fillbank[j] = 0x20;
悠然 17:51:21
这个可以搞成个方法。
悠然 17:51:49
Tiny里面,不允许写if(...)aaa;else bbb;
悠然 17:52:12
必须写成:
if(...){
aaa;
}else{
bbb;
}
路人甲 17:52:17
Ok
悠然 17:52:36
同样也不允许写for(...)aaa;
悠然 17:52:49
必须写
for(...){
aaaa;
}
悠然 17:53:34
这个的用处,在于当你发现在循环体内一行语句不够的时候,不要担心忘记加{}而引起新的BUG
路人甲 17:54:45
嗯。我再改改
悠然 17:55:01
悠然 17:55:15
今天一定改好呀,拖到明天,就变中级程序员了:)
路人甲 17:55:32
Ok
悠然 17:56:24
路人甲 17:56:36
悠然 17:56:45
千万不要粗心哦,后面给你大块头,你这要一粗心。
悠然 17:56:53
不是要种下遍地的BUG了??
路人甲 17:57:14
好的。我一定
悠然 17:57:48
偶相信你,几点pull我??
悠然 17:58:09
我好及时看,避免明天看,再发现问题,你就真跑中级去了:)
路人甲 17:58:44
我7点pull
路人甲 17:59:04
也许更早,我仔细再核查一
路人甲 17:59:07
遍
悠然 17:59:17
好滴,我8:00左右看。
悠然 17:59:23
到时我给你留言。
路人甲 17:59:29
好
悠然 17:59:35
偶看好你~~
悠然 18:01:42
路人甲 19:05:41
路人甲 19:05:46
悠然,这一版你可满意?
悠然 19:06:07
悠然 19:06:13
这才是做程序的态度。
悠然 19:06:23
你自己感觉一下,性能如何,代码整洁度如何?
悠然 19:06:41
NB的程序员就是不多干,也不少干。
路人甲 19:07:19
我准备pull给你了
悠然 19:07:30
仔细检查哦。
悠然 19:07:38
你已经玩了我好几次了。
路人甲 19:08:23
嗯,这一版我一行一行看过了。希望你满意
路人甲 19:08:31
我pull你,然后就先回去了
悠然 19:08:34
悠然 19:08:42
其实这个代码还有优化的空间。
悠然 19:09:04
路人甲 19:13:52
悠然,你收到没
路人甲 19:14:00
路人甲 19:14:07
我冒似没pull成功呀
悠然 19:14:24
4小时前有一个。
悠然 19:14:44
我把那个关闭了。
路人甲 19:15:10
好了
路人甲 19:15:12
成功了
悠然 19:15:29
刚才那个方法还可以优化:)
悠然 19:15:33
你再仔细看看。
路人甲 19:15:53
好
悠然 19:21:12
从性能优化的角度看,还可以改成速查表。
悠然 19:25:18
bodybuffer
悠然 19:26:00
悠然 19:26:24
悠然 19:26:57
悠然 19:27:09
这里的encode是多传的。
悠然 19:27:18
dbffos
悠然 19:27:26
bodybytearray
悠然 19:28:22
fieldNameBytearr
悠然 19:28:34
destlen
悠然 19:29:21
fillbank
悠然 19:30:58
悠然 19:39:13
路人甲 20:44:55
encode不是多传的。只是忘了用了
路人甲 21:02:36
悠然 21:02:38
路人甲 21:02:49
你是这意思不,悠然
悠然 21:03:08
悠然 21:03:19
嗯嗯,当然,实际区别也不大。
悠然 21:03:32
这里仅是说一下如果优化到最好,是应该怎么优化的。
路人甲 21:03:34
少了在栈里的运算
悠然 21:03:58
你这个代码写得太随意呀。
悠然 21:04:13
挺不错的人,被耽误了。
悠然 21:05:38
你的接口方法设计得有问题。
路人甲 21:05:58
请指教
悠然 21:06:14
呵呵,你有一个save()方法。
悠然 21:06:21
不知其可。
悠然 21:06:34
我看了你的代码,知道你是干啥的。
悠然 21:06:43
但是从设计上说,是失败的。
悠然 21:07:09
然后,那个write(String...args)也不太好。
悠然 21:07:37
如果人家已经知道类型了,必须得转成String,然后再从String进行转换成要写的数据。
悠然 21:07:49
这个是非常不方便的。
路人甲 21:08:29
你觉得用参数列表来解决传记录的值的方案合不合适 呢
悠然 21:08:46
实际上不太合适,但是也还可以接受。
路人甲 21:11:39
嗯。我觉得这样调用方便一些,我开是将参数弄成Object类型的。后来看你读的时候全当字符处理的,我就把参数弄成String了
路人甲 21:12:42
设计成Object,再用反射去判断是不是基本类型,然后填充相应的字节
悠然 21:16:53
可以用类型判断的。
悠然 21:17:07
类型不对,抛异常就好了。
路人甲 21:20:01
关于有个save方法。。我的考虑的前提是,所有字段名和数据都添加好以后再写入文件
这样就要有一个指令来告诉程序,他已经结束输入 了
悠然 21:20:23
嗯嗯,所以我知道你的意思。
悠然 21:20:44
如果仅用来表示这个意思,close都比save合适:)
路人甲 21:26:47
嗯。受益良多。