-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfeed.xml
1004 lines (1003 loc) · 150 KB
/
feed.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>pezy's blog</title>
<link href="feed.xml" rel="self" />
<link href="" />
<id>feed.xml</id>
<entry>
<title type="html"><![CDATA[2015 年终总结]]></title>
<link href="talk/summary-2015"/>
<published>2015-12-31T00:00:00.000Z</published>
<updated>2015-12-31T00:00:00.000Z</updated>
<id>talk/summary-2015</id>
<content type="html" xml:base="" xml:lang="en">
<![CDATA[ <p>又是一年。</p>
<p>今年完成了去年两个愿望:</p>
<ol>
<li>喜结良缘</li>
<li>换了工作</li>
</ol>
<p>想对她说的话:感谢<a href="http://pezy.github.io/love/">这个页面</a>陪伴你我走过了 1228 天。当初的愿望,今已实现。回顾过往千日,历经种种悲欢,实属不易。今日之幸,我惟有努力珍惜,方可对得起此上天的馈赠。无论未来还有多少艰难困阻,愿你我可以不忘初心,不离不弃。</p>
<p>想对老东家说:感谢公司让我从一个冒失的毕业生成长成为一名合格的开发工程师。感谢第一任领导 S 给了我学习/编写 C++ 的机会;感谢我师傅,让我明白了好软件的标准,以及钻录测的常识,更是带着我领略了名山大川、戈壁草原,让我体验了社会上的人情世故。我在数据采集方面的所有见识、经验、甚至代码,可以说皆来自这位师傅的倾囊相授。感谢第二任领导 Yao,让我了解到大公司的流程与规范,让我见识了在实际服务器上稳定运转多年的代码,是我网络编程的领路人。虽然后来我们多次意见不同,但我始终相信他能够带领我们经历一次真正成功的项目(最后他也放弃了,what a pity.)。感谢第三任领导 X,把我从不断失败的项目中解救出来,让我了解到一个产品的研发轨迹,让我从浮躁的环境中逃离,沉下心来学习一些技术。也感谢我的另一个师傅 Dr. Shu,规范了我的编码习惯,让我真正夯实了 C++ 基础,还是我图形学、算法的领路人。虽然我与公司的大环境格格不入,但公司给了我这样一个平台,结识了这许许多多的牛人,接触了形形色色的技术,干过技术支持、开发、运维、测试、网管、数据库维护等等类型的工作,也让我增加了不少见识,沉淀了不少经验。子曰:"吾少也贱,故多能鄙事"。第一份工作,对于我的意义,也在于此。</p>
<hr>
<p>上半年我还是希望按部就班的完成 CP 和 LeetCode 两项具体的计划。可 2-3 月份接连不断的<a href="interview">面试打击</a>,完全击溃了我的心理防线。让我无心在这两项上花费精力。现实就像一盆盆冷水,让我了解到,单纯的 C++ 岗位,何等的稀少。自己已经没有了毕业生的优势,经验又不足以让对方心动。实在是一个尴尬的处境。</p>
<p>祸不单行,随着 Dr. Shu 的带头离去,团队里的同事接连离职。大有最后仅剩我一人之势。还好,领导 X 给我介绍了一个工作机会,这才卸去找工作的压力。</p>
<p>那段人心惶惶的日子,干活效率远不如前,不过属性模型的相交检测和切割的难度也的确比之前有很大的提升。上半年基本就和这些东西较劲了。闲暇之际又想复习数据结构与算法,还想通过 WebGL 来实践 OpenGL。</p>
<p>下半年算是否极泰来,主要是原公司给了一次<a href="http://pezy.github.io/blog/talk/work-project-exam">集体在职研究生</a>的机会,又机缘巧合接到两份私活。一份与工作内容很相近,另一份则完全是一个陌生领域。不过我基本都是负责 GUI 部分的。</p>
<p>在职研究生因为离职的原因,基本泡汤。私活对我的锻炼,则体现在代码重构能力上,以及对代码的品味上。重构能力或许好理解,何谓品味呢?即怎样的代码才算是好代码。初学编程,觉得代码能工作起来就行;后来知道了优劣,觉得精简、机巧的代码算是好代码。现在,觉得普通到你一眼就知道代码意图的代码,才是好代码。这种判断,就是我所谓的品味。往往写出能工作的代码,最为简单;其次是精简干净的代码,往往你查一查 Google/StackOverflow 就基本也能写出。最难的则是"普通到白水"的代码,没有清晰的思路,反复的推敲,很难写出。这样的品味,在《重构》、《代码大全》等书里都有讲述,或者可以在王垠的小文<a href="http://www.yinwang.org/blog-cn/2015/11/21/programming-philosophy/">《编程的智慧》</a>里可见端倪。</p>
<hr>
<p>今年我对自己的反思多于对自己的认可。并写了两篇博客<a href="introspection1">1</a>,<a href="introspection2">2</a>来阐述反思的结果。第一篇想说时间并非是线性的,也可以并行;坚持并非一定是不间断,更重要的,是不放弃。第二篇,则是想说如何善待自己,把自己也当个人物。这就包括让一些需要持续的事情,在自己心里留个好印象;要像打太极那样,始终留着一股劲,别一气用完。有些坚持,需要这股劲提醒着自己。</p>
<p>这两篇反思,都凸显了我的短浅,喜欢搞战术,不重视战略。在乎一城一池的得失,动不动就毕其功于一役,细节上较真又纠结,恨不得精雕细琢。然而人的精力终究有限,战术家但求一战成名,有时便会赔上大局;战略家运筹帷幄,耐心等着对手四面楚歌,往往也大行不顾细谨,经不起推敲把玩。</p>
<p>实际上,战术与战略,只是角度不同,并无优劣之分。但这个世界唯一线性的是时间,时不我待,机会往往转瞬即逝。所谓恰到好处,则是优势与时间的配合。若优秀的战术,用在了关键的时间点,那便是转折。而再好的战略,若没有契合时间点执行,也终为一纸空文。</p>
<p>回头看看<a href="introspection2">我的怪圈</a>,最大的问题,便是没有明白,什么时间段该做什么事情。高中时代,就应该打下基础,尤其要补上自己的短板(因为此刻是补短板代价最小的时机)。到了大学,就该深入学习专业知识,开阔本专业范围内的眼界,啃大砖头,夯实理论知识(因为此刻是深入理论代价最小的时机)。</p>
<p>为什么我现在回头看,就如此笃定之前的时间段,该干的事情呢?因为只有从那个时间段走出,才会切身体会到遗憾。如我高中遗漏的英语,大学错失的专业基础,都让我接下来的路越发的艰难。那亡羊补牢吧,工作阶段,最应该干的是什么呢?</p>
<p>这个我答不上来,不识庐山真面目,只因身在此山中。</p>
<p>或许只有不断反思,才能逐渐接近真相吧。</p>
<hr>
<p>今年我并不想给 2016 年安排什么具体的计划。因为之前的计划,基本到了年底,就是给自己打脸而已。读了多少书,做了什么事,终究只是表面,只是形式。那什么才是内涵,才是本质?</p>
<p>看着镜子,问问自己,1 年来,有什么变化?是好的变化,还是坏的变化?哪些进步?哪些退步?</p>
<p>这时候的回答,多半才是本质。</p>
<hr>
<p>没有计划,但不妨碍愿望。我最爱这种漫天许愿的感觉了。</p>
<p>2016 年,我应该仍会为 Kerogen 效力,希望可以打造出一款真正可用的产品。</p>
<p>2016 年,我应该认真的和 Jian 规划一次出国旅行,希望顺顺利利。</p>
<p>2016 年,我应该要督促自己养成多角度思考的能力,反复权衡,最终得出简单的方案。</p>
<p>2016 年,我应该在工作上突破自己,争取不给同事挖坑,在完成质量上更进一步。</p>
<p>2016 年,我应该要养成每日反思的习惯,从点点滴滴开始,改变自己的幼稚与轻率。</p>
<p>2016 年,我应该更注重身体健康,减少熬夜次数,增加体育锻炼。希望可以将体重控制在 150 以下。</p>
<p>2016 年,我希望能够租到一个满意的房子,开始二人二猫的日常生活。</p>
<p>就这么多,已经够贪心了。</p>
]]>
</content>
</entry><entry>
<title type="html"><![CDATA[几点反思(二)]]></title>
<link href="talk/introspection2"/>
<published>2015-11-22T00:00:00.000Z</published>
<updated>2015-11-22T00:00:00.000Z</updated>
<id>talk/introspection2</id>
<content type="html" xml:base="" xml:lang="en">
<![CDATA[ <h2 id="黑色的高三">黑色的高三</h2><p>记忆里的高三,是黑色的。那段时间留下太多的遗憾,以至于我害怕想起,偶尔想起也会暗自神伤。上课睡觉、和父母发脾气,甚至不做考题,不写作业。这些幼稚愚蠢的行为,总会一次又一次的刺激我的神经,让我百般悔恨,却又无可奈何。</p>
<p>距离那年高考已经八年有余,我和那段记忆的抗争也不断持续,最终记忆褪去了长夜般的颜色,恢复了本来的样子。</p>
<p>遗憾,是因为起落,如果没有过巅峰,也就不存在低谷。高中的我,本质上是一个暴发户,暴发在高二。或因文理分科,或因暗恋动力,或因师生缘分,总之高二集齐天时地利人和,让我从一个传统差生,一跃有了冲击清北的幻觉。高三去了所谓的“重点班”,屡受重创,从此便一蹶不振。</p>
<p>其实现在想来,我无论从哪个方面,都没有成为真正“优等生”的条件。</p>
<ol>
<li>科目上,我有明显的弱项:英语。从初中开始就基础不牢,并从未有所改善。其他科目,除了数学、语文,也只是维持中等水平。</li>
<li>高一,我是个不折不扣的差生,几乎所有科目都在及格线上徘徊。成绩,后来可以赶上来,但这些知识却很难再有机会巩固。到高三,就会需要更多的努力来弥补这部分薄弱的知识点。</li>
</ol>
<p>总结来说,<strong>短板依然是短板</strong>,<strong>学习缺乏连续性</strong>。</p>
<p>这两大原因,都被我高二数一数二的成绩所掩盖,直到高三才给我致命一击。更致命的是,高二“成功”的学习经验,几乎毫无技巧可言,就是投入大量时间。那段时间我熬夜很严重,但学习兴致也很高,短期的正面回馈也很多。让我错失了许多纠正坏习惯的机会。俗话说:“战术上的勤奋,容易掩盖战略上的懒惰”。此之谓也。我的坏习惯包括,周末、寒暑假容易完全放松,作业喜欢拖延,喜欢集中突击。这样就很容易造成,之前的努力无法持续回馈,需要反复花费大力气补回。就像一场千米长跑,我总以百米加速的速度取得暂时领先,然后无以为继,再次加速,再次无以为继,再而三,三而竭,最终无力前行。</p>
<p>这些原因会造成的后果,我当时完全没意识到。我的父母、老师,更容易从分数、结果出发,同样忽视这些潜在的缘由。最终在高三重压之下,我接连沦为倒数,产生前所未有的<strong>挫败感</strong>。一败再败,完全失去信心和勇气。结果也可想而知。</p>
<p>其实很多陋习、错误,什么时候改正都不算晚。唯独<strong>挫败感</strong>最可怕,它能轻易的产生恶性循环,碾压人的士气,模糊人的心智。更严重的,还会产生绵延不绝的后遗症。</p>
<h2 id="迷惘的大学">迷惘的大学</h2><p>许多人大学有遗憾,是因高考后的彻底放松。而我却略有不同,高考的结果给我带来了诸多不好的影响,包括与同学的失联(自卑所致),家人态度微妙的转变,自我谴责等等。我没有任何理由放松,相反还有一直有着沉重的包袱。</p>
<p>但很快美丽的哈尔滨就给了我新生的幻觉,我没有嫌弃自己的大学,相反很接受它。大一第一学期的成绩,也像那么回事,比起糟糕的高一,算是开了个好头。难以想象,我那时竟然也会早早起床,去寒冷的操场读英语,也会列满计划表,为没有完成而羞愧,也会在网吧通宵,只是为了完成作业。不过挫败感依然如约而至,或是因为一次糟糕透顶的表白,一次未果的恋爱(算是最单纯勇敢的一次);亦或是因为寒假的懒惰,错过 ACM 的磨砺。总之,熟悉的挫败感如约而至。我甚至又捡起了高三的麻药:文学创作。幻想着自己可以走“擅长”的道路。其实这不过都是逃避,“榕树下”那封毫不客气的退稿信给了我当头一棒,郁闷之下,又有了放弃之心。于是买好的文学史教材再未翻开,山海经和史记也成了摆设,几部未成形的小说,也永远的停在了开头。</p>
<p>要知道,我是一个计算机系的学生,那些旁门左道,没让我成为更好的自己,反而给我带来了更致命的打击:挂科。也让我的计算机生涯开了一个很不好的头:对 C 语言的畏惧和厌恶。现在想想,其实大一下是多么黄金的时期。高数、大物,C 语言,数据结构。我糊里糊涂的错过了工科的基础,编程的基础。给后续的大学生活蒙上了阴影。</p>
<p>然而这些并非最糟糕的,更糟糕的依然是<strong>挫败感</strong>,这个东西从未间断。让我懦弱不堪,三心二意,疲惫不已。</p>
<p>我的成绩,直到大三借着分硬软方向时,才逐步走上正轨。我才逐步开窍,明白了编程的快乐。可是那时,我的同学们早已眼界大开,皆备傍身神技;诸多学长人脉,各个项目缠身。那是最需要疯狂 coding 的时期,而我还在图书馆看着各类软件方法论,懵懵懂懂。</p>
<p>值得一提的是,我在知乎上<a href="http://www.zhihu.com/question/19599607/answer/28751194">第一个答案</a>,便是关于大学的回忆。无意间流露出的伤感,难以掩饰。</p>
<hr>
<p>总得说来,大学的遗憾,几乎都和一个"晚"字有关。</p>
<ol>
<li>对编程的兴趣来的太晚。</li>
<li>程序圈的眼界开的太晚。</li>
<li>如何正确利用网络明白的太晚。</li>
<li>基础课程的重要性明白的太晚。</li>
<li>经典书籍看的太晚。</li>
<li>英语能力补的太晚。</li>
<li>成绩的重要性认识的太晚。</li>
<li>考研计划和准备的都太晚。</li>
<li>找实习和工作准备的太晚。</li>
</ol>
<p>说白了就是事事都迟一步,等到意识到,时光荏苒,一去不返。</p>
<h2 id="庸碌的工作">庸碌的工作</h2><p>古语有云,亡羊补牢,为时未晚。</p>
<p>刚工作时,我便想好好把以前的痛点补上,但方向上却犹犹豫豫,一边复习着 Java Web,以熟悉公司项目代码;一边又看着 C#,想掌握一些更新的技术;同一时间,又觉得数据库重中之重,买了 Oracle 的大砖头准备啃。由于没了学业的重压,工作上又因项目方兴未艾,自己把控的时间较多。这才开始关注编程的技术圈子,开始知道遇到问题,怎样咨询 Google 和 StackOverflow。那时犹如刚出牢笼的鸟,左突右冲,恨不得齐头并进。又对考研并未死心,还抽空背着英语单词。</p>
<p>第二年,长达半年之久"<a href="end-of-2012">野外奔袭</a>",让我从千头万绪走入另一个极端:放任自流,随遇而安。今日不知明日在哪的日子里,毫无计划可言。工作上,无关紧要的杂事不断,于己却毫无益处。还好遇到了些奇人,看到了些奇景,想明白了一些世事。倒也不枉。后一年里,我遇到第一位倾佩的领导,又彻底放弃了考研之路。重心开始往工作上倾斜,做了很多杂活,尝试了很多技术实践。现在想起,仍然觉得这是必须经历的一段混乱。敢于尝试新鲜事物,才会知道哪里不足;知道不足,才会明白需要看哪些书;知道要读的书,才能理清技能树的脉络;最终才能形成对计算机派系、结构、知识点的把握。但那时的问题也很明显,浮躁不知深浅,这也是第一家公司的通病,夸夸其谈不落实,纸上谈兵不知浅。随后在 <a href="summary-2014">工作的第三年</a>专门治了下这个毛病,开始回头恶补基础。恰好工作上又有机遇让我接触到图形学,这盆冷水才泼的够彻底。</p>
<p>虽然意识到基础的重要,也很清楚努力的方向,随着工作节奏越来越紧张,我却显得越发的有心无力,捉襟见肘。而前几年略显离经叛道的工作经历,显然没有给我养成良好的工作习惯,这就体现在我并不真正明白"实际工程中的代码"到底应该怎么写;更直接的,我估计不好工时,我不会合理的重构,我竟然也会处处埋坑,有时坑自己,有时坑同事。火上浇油的是,工作的变更,让领域背景显得越发的重要,在同事们视为常识的专业知识,我却很难准确理解。这个阶段的痛苦,在于既缺乏成就感,又容易产生自我怀疑。</p>
<p>总之,四年的工作,可谓 "庸碌"。看似忙碌,实际成长缓慢,产出低下。</p>
<p>这里只总结最严重的三个问题:</p>
<ol>
<li>不分轻重,小事容易优柔寡断,大事容易率性而为。(这里的"大小",是依据对未来影响而言)</li>
<li>心态不佳,弦紧绷不住,弦松止不住。不擅调节情绪,不擅分解压力,不擅预估,不擅留余。</li>
<li>习得性无助,不注重培养自信,过早的投降,不正确的归因都是形成的原因。应学会每天给自己多提供正面反馈,减少负面印象。</li>
</ol>
<hr>
<p>一路走来,看似遗憾多多,挫折不断。但想要跳出自己"失败"的怪圈,不断分析原因很重要,<strong>取悦自己</strong>也很重要。我常常趁着精力十足拼命学习,拼命工作,抱着一种短浅的眼光榨干自己的激情。长期以来,是极为致命的。因为这样的疲惫和精疲力尽会成为"学习"和"工作"在心里留下的印象,久而久之,就成了恐惧,进入习得性无助的怪圈。知道何时止,何时进,是需要锻炼的。</p>
<p>我一直忽视了这方面的作用,只知道埋怨自己,埋怨自己。</p>
<p>怪圈无涯,而吾生也有涯。愿亡羊而补牢。</p>
]]>
</content>
</entry><entry>
<title type="html"><![CDATA[Qt 中国峰会上的思考]]></title>
<link href="talk/thinking-on-qt-develops-days"/>
<published>2015-11-09T00:00:00.000Z</published>
<updated>2015-11-09T00:00:00.000Z</updated>
<id>talk/thinking-on-qt-develops-days</id>
<content type="html" xml:base="" xml:lang="en">
<![CDATA[ <p>Qt 开发者大会应该算是我唯一在线下参加过的技术集会了。去年一次偶然的机会,在 Qt 的主页上看到了大会的通知,报名也没有太多的门槛,本着学习的态度,就尝试报了名,拉上一个同事就去了。</p>
<p>或许那会对 Qt 的认识仅仅停留在很肤浅的认识上,大会上我并未学到太多的知识。寥寥的与会者,酷炫的 Demo,关于 QML 和 Qt Quick 这些『前沿』的话题也并未勾起我足够的兴趣。但中午那顿自助餐,着实给我留下了很深的印象。当时我对同事说,今天没白来,至少这顿饭就挺值的(似乎暴露了吃货的本质)。</p>
<p>有了上次参与的经历,这次的大会通知就直接躺在我的邮箱里了。我脑海里先是浮现出高档自助,然后才出现 Lars Knoll 飘逸的发型。恰好对于 Qt 5.5 中出现的 Qt3D 模块有莫大的兴趣,于是就想着再去凑一次热闹。</p>
<p>我对这次的内容并未抱很大期望,本着「蹭饭不亏本」的原则按时参加。果不其然,一去便发现多了个脑残的拍照环节,还要发微博才可以拿奖品。这些不提,整个上午的会议,基本也味如嚼蜡。好不容易挨到了中午,吃饭竟然还排着队,当时隐隐感觉不妙,后来发现果然让人大跌眼镜,原来我期盼的大餐,只是盒饭而已。</p>
<p>落差也忒大了,看来今年 Qt 效益不好呀。</p>
<hr>
<p>下午的议题还是有点干货的,除去不懂技术的糟糕翻译不提,迪智公司各位领导对前沿技术的一些看法的确启迪了我。我忽然觉得这<a href="work-project-exam">几个月</a>来我有点闭目塞听了。Win10 出来这么久,UWP 也早就成了知乎上的冷饭,我竟然也都没去关注过。这个略微有点饥饿,却十足悠闲的下午,让我想到了很多:</p>
<ol>
<li>Qt 支持 Win10 的速度很快,并骄傲的告诉各位开发者,不用担心全新 WinRT API 带来的更新困扰。而我想到的却是,Windows 全平台的优势的确不容小觑,用了近 10 几年的 Win32 API 将走向末路,<strong>是时候积累 WinRT API 的经验了。到现在还没接触过 C# 的程序员们,也应该适当的了解一下了</strong>。这一股技术势力,或许真的有可能成为一种主流的方向。</li>
<li>Qt 的 QML,QSS之流,我一直觉得走错了方向,有一种硬是用 C++ 迎合 Web 开发潮流的感觉。<strong>与其去花功夫研究这些,不如老老实实把 HTML5,JavaScript,CSS 等前端技能点补全</strong>。Web 依然是这个时代的主流话题,在移动时代,依然坚守着阵地。掌握标准、主流的技术,可有备而无患。</li>
<li>Qt3D 的定位,貌似倾向于 3D UI 的支持,更长远的说,是为了虚拟现实、全息投影铺的道路。这表明了 Qt 在这方面的野心,毕竟微软的 HoloLens 已经真实的证明了这条路的可行性。但这与传统的三维建模技术却有些出入,想用这个模块进行模型开发的同学们,可以省省功夫了。</li>
<li>Qt WebView 模块将全面取代 WebKit,而 Qt 的 Web 引擎经介绍,也只是对 Chromium 的封装。<strong>这进一步证明了 C++ 客户端开发的终极项目: Chromium 的崇高地位。</strong>如果你恰好走在 C++ 客户端开发的道路上,不接触一下 Chromium 的代码,一定称不上合格。</li>
<li>接着上一个话题,借着 Chromium 的 V8 引擎,Qt 将来可以全面支持 OpenGL ES 2.0 的标准。<strong>这意味着无论是游戏领域,还是三维建模领域,都有必要好好学一学 WebGL 的开发模式了</strong>。WebGL 作为简版的 OpenGL,逐步有问鼎中原的意思。</li>
</ol>
<p>以上五点,是我与会时的一点感悟,可能完全不是 Qt 宣传的意图。总的来说,我的职业规划里,需要考虑到这些点,如 WinRT,前端,WebGL,以及 Chromium。与我职业道路类似的 C++ 程序员,也可以借鉴借鉴。</p>
<p>至于还有其他的一些精华内容,都略显细节了。如 QML 与 C++ 的通讯问题,一些设计模式的理念和方法。也的确值得一听。但这些东西,依然需要通过实践去检验。</p>
<hr>
<p>连续几个月的忙碌,让我有点模糊了目标。今年也快要过完了,去年的计划大半又成了吹嘘而已。研究生考试让我有了重新捡起数学知识的冲动,Qt 大会又让我再次焕发了对新技术的热情。</p>
<p>至于去年的学习计划,我有几点改动:</p>
<ol>
<li>C++ Primer 目前对于我的意义很小,但我尽量要抽时间完成 16 章的习题,巩固泛型和模板的知识。 LeetCode 在换工作之后,几乎停滞,去练习它也逐渐失去了最初的意义。算法的掌握,还是尽量系统的进行,而不是功利的去练习解题技巧与速度。</li>
<li>线性代数之前,我想补习一下微积分的知识。这样相对来说,更为全面。</li>
<li>那三本书:CSAPP + SICP + CLRS,今年决计是无法看完了。这些知识,是根基和内力,也不必急于一时掌握,略闲之际,可以安排个计划逐步读之。</li>
</ol>
<p>结合之前的一点感悟,我希望在最后两个月里,可以对私活做个了结。在不影响正常工作的情况下,对微积分和 WebGL 进行集中学习。</p>
<p>另外要多读读 Chromium 的代码了,就像 Doom3 的代码那样。</p>
]]>
</content>
</entry><entry>
<title type="html"><![CDATA[工作,私活与在职研究生]]></title>
<link href="talk/work-project-exam"/>
<published>2015-11-08T00:00:00.000Z</published>
<updated>2015-11-08T00:00:00.000Z</updated>
<id>talk/work-project-exam</id>
<content type="html" xml:base="" xml:lang="en">
<![CDATA[ <p>最近的几个月,发生了很多变动。其一,便是换了工作,提前完成了<a href="summary-2014">今年的计划5</a>。其二,工作之余和前同事一起接了一个外面的项目。其三,考了在职研究生,算是<a href="summary-2014">计划5</a>的另一个 backup。</p>
<p>就在研究生考试的前一周,我的焦虑几乎到了顶峰。新工作的压力很大,以前对自己的定位是一个好用的钉子,而现在却是努力的当一个好锤子。钉子只需着力于一点,深钻下去;而锤子却需要不断打磨,该平的地方平,该翘的地方翘,时刻稳固,时刻强力。私活的压力也不小,因为工作时间的挤压,每天留给私活的时间所剩无几,几乎完全依赖前同事的主导。这种情况下,复习在职研究生考试,就更加不切实际了。</p>
<p>我以为自己可以平衡好这些事情,没想到越忙就越乱。</p>
<p>工作上,历史遗留的垃圾代码给我造成了很大的阻碍,为了不影响新功能的开发,不耽误产品的发布计划,我也没有进行大规模重构的条件,只好小修小补,慎之又慎,稍不注意,就会拔出萝卜带出泥,延误正常工作。我是一个极度注重细节的人,又有点代码洁癖,加上对领域知识的严重欠缺,直接导致了好几次的重构尝试收不了场。而领导不会过问重构方面的事,他们只关注新功能的进展与Bug 的及时修复。这就好比在一个较差的地基上盖房子,盖的很费劲,却不得不一直盖下去。看似很矛盾,却是软件开发领域最常见的一道难题。研发能力,很大程度上也取决于对这个矛盾的解决上。<a href="http://book.douban.com/subject/4262627/">重构: 改善既有代码的设计</a> 这本书重点就是讲述这个矛盾的解决思路。很显然,我在这方面的确极为欠缺,直接导致在领导面前多次狼狈不堪的局面。</p>
<p>虽然私活比工作内容略显轻松(至少不用经常修改代码,而以产生新代码为主),但时间的分配却经常失衡。入职第一天,我就告诫自己,要有基本的职业操守,工作时间就专心做工作上的事情。于是我甚至没在公司电脑上安装私活所需的开发环境,以往无时不刻刷的知乎白天基本不打开,Github 上的小玩意也都完全停产。而让我始料不及的是,即使这样,我的效率并没有多大的提升,有时甚至需要加班弥补。这就直接导致私活的时间被压缩到极致,久而久之,花在这上面的心思也少了,几乎完全依赖合作者的推进。很多次我都想过放弃,事实证明我无法同时做好这两件事情,我也头一次达到自己的代码输出高峰时期,几乎日夜不停地看代码、写代码、修改代码。不得不承认,大部分时间,我都是痛苦大于快乐的。我甚至不敢再到处宣称自己是一个热爱编程,享受代码的人了。更为关键的是,这两份活,鲜有新的知识补充,几乎都是对已经掌握技能的一次次锤炼。要说进步,也只能体现在代码重构能力上,以及对 Qt 的熟悉程度上。虽然我依然在坚持,但完全失去了主动性,也时刻对合作者有着很强的愧疚感。</p>
<p>以上两项的压榨下,我几乎没有时间来复习在职研究生的考试了。虽然我本人对此完全没兴致,但这毕竟是前东家的一次福利,也是父母一直期盼的事情。完全放弃,我也不会甘心。庆幸的是,考试内容真的很简单,和正式研究生的考试不在一个难度上。我总共复习时间,不超过三天。虽不知结果如何,但就考完后的感觉来说,不算太糟。</p>
<hr>
<p>这三件事同时发生,并不是我能预料的事情。但却很真实的反映出我差劲的能力。我不得不承认,我只适合专注于一件事上,且这件事也仅仅是做到及格而已。这让我想起大学时代的考试,我认真地听课、做笔记、看书,至少形式上做到了好学生该做的一切,但结果却往往只是在及格线上挣扎罢了。我不得不接受这些残酷的现实。说好听点些,这是没有抓住学习的精髓;说的理论些,则是抓不到重点,不分轻重缓急;说的实际些,这反映了一个人的综合能力。人与人在综合能力的差距上,绝对比人与狗的差距还大。</p>
<p>离而立之年,我仅剩下短短五年的时间。我越来越倾向于某种宿命论,总有人需要平庸,注定泯于众人。这也没什么不好,适当降低最自己的期望,砍去一些无谓的精力消耗。知道自己能做什么,做不了什么,然后把自己的精力定格在这些能做的事情上。平静地,耐心地,让时间有规律的投入在这些事情上。心态安定平和,才可以产生真正的思考,看清事情的本质。这些话说的啰嗦,实际却正好对应着「大学」的开篇:</p>
<blockquote>
<p> 知止而后有定;定而后能静;静而后能安;安而后能虑;虑而后能得。</p>
</blockquote>
<p>我应该庆幸,自己毕竟还有五年,至少还有折腾的资本。越折腾才越能了解自己的『止』在何处,为日后内心的安定打下基础。</p>
<hr>
<p>这段痛苦的日子里,我蛰伏在亚运村一个不足十平米的小隔间,研究生考试前,整个喉咙都发了炎,难受的整宿睡不着觉。</p>
<p>现在好多了。工作上,我期盼已久的博士总算加盟了公司;考试也算是告一段落。但各种压力却并未轻松,3D 窗口依然有不知原因的 Bug,私活也有一大堆问题等待解决。</p>
<p>更有我全篇未提及的生活,感情没有着落,婚姻遥不可及。事事皆哀,徒有消磨。</p>
<p>好想停下脚步,好好休息休息。</p>
]]>
</content>
</entry><entry>
<title type="html"><![CDATA[面试小感]]></title>
<link href="talk/interview"/>
<published>2015-04-03T00:00:00.000Z</published>
<updated>2015-04-03T00:00:00.000Z</updated>
<id>talk/interview</id>
<content type="html" xml:base="" xml:lang="en">
<![CDATA[ <p>最近去面试了两家公司,一家做嵌入式开发,一家做游戏。</p>
<p>都有笔试、上机、面谈等等环节,只不过一家偏重 C 语言,另一个偏重 C++,我姑且称之为第一家与第二家吧。</p>
<h2 id="笔试">笔试</h2><p>第一家的笔试题,就跟大学的考试无异,基础的 C 语言语法,一些概念的辨析,大片大片的选择题。</p>
<p>第二家的笔试题,要更加实际,直接上代码,然后问你这段代码目的是什么?有什么问题。</p>
<blockquote>
<p>在我看来,第一家重视基础,且因为同时参与招聘的还有校招,所以懒得为社招单独出题了。第二家,是比较务实的,会不会改 Bug,对于一个职业程序员来说,是一项最基本的功能。C++ 里坑尤其多,就看你能不能一一识别出来,然后轻松的躲过。</p>
</blockquote>
<h2 id="上机">上机</h2><p>第一家的上机,是两道算法题,第一道关于子网掩码划分问题,给你两组 <code><IP 地址,子网掩码></code>,让你求这两组是否在同一段。第二道是丑数,属于数学公式类的。</p>
<p>第二家的上机,是一个类的实现,没错,就是传说中的 <code>String</code> 类的实现,包括自己写测试用例来测试该类。王月说这个没难度,我想主要原因是 C++ Primer 里面有这方面的内容,但书里的写法是基于 <code>std::allocator</code> 的,对于与 C 语言的兼容基本没考虑,里面也是存在一点小坑的。如 <code>c_str()</code> 如何实现?我后来完善了习题答案,补充了这方面的考虑,的确还花费了点精力。</p>
<p>试想,如果面试前,你完全没考虑过这方面的问题,也没做过这习题,你能否在短短几十分钟内写出整个类,以及测试用例?</p>
<blockquote>
<p>对于面试中遇到 String 类的实现,我非常不建议你用 <code>std::allocator</code>,因为上机环境,我还没见过一家用 VS 2010 以上来考察的。第一家是 VS 2005, 第二家是 VS 2008。 C++ 11 就不用想了。建议使用 <string.h> 来辅助实现,如 <code>strcpy</code> + <code>strlen</code> 等函数。这样的方式更简单,代码量极少,在比较紧张的情况下也不会写错。但坑爹的是,VS 里 <code>strcpy</code> 会有警告,尽量提前了解下 <code>strcpy_s</code> 的参数。(我是当场临时决定这种方案的,没想到效果不错)</p>
</blockquote>
<p>综合来讲,上述两个环节,我还是很坚挺的,基本没出什么岔子。这得益于我花了近半年的时间来写《C++ Primer 5th》的答案,和一天一道做 LeetCode 题。</p>
<h2 id="面谈">面谈</h2><p>对于学生,这个环节可能要轻松一些,因为只要你在学校不是瞎混了四年,眼界也不仅仅局限于各种垃圾培训视频和 QQ 群、贴吧讨论的话,基本没啥问题。</p>
<p>但对于我这样社招的人来说,就算是真正的考察环节了。</p>
<p>这个时候,你有没有用心工作,对于平时工作内容认识到什么深度,就很关键了。我的前三年,在数据采集上投入了极大精力,而且由于自己负责了一个较核心的模块,所以对于整体架构,以及几乎全部代码细节,都有很深刻的认识与领悟。而近一年来的三维图形开发,却总感觉没有入门,甚至感觉连门都没摸着,工作也很痛苦,鲜有成就感。</p>
<p>于是,这就是“看对眼”的环节了,第一家公司对我前三年的那个项目很感兴趣,重点询问了那个,那我当然是侃侃而谈,相谈甚欢了。于是这一环节也很顺利。第二家公司,因为是做游戏的,显然对于三维图形方面感兴趣,我立刻现出原形,捉襟见肘起来。</p>
<blockquote>
<p>我的教训是,尽早的选对方向很重要。除非你是学生,否则全面撒网一点好处也没有。还是那个比喻,一个只会九阳神功(内功)的张无忌,是无法解光明顶之围的,只有练成了乾坤大挪移(实践经验)才行。我一年前决定换到自己完全不熟悉的图形领域,其实还是有很大风险的。这个方向与我之前做的应用软件不同,短短不到一年的时间,是根本无法深入了解的。数据采集的坑并不深,做久了,几乎就摸着底了,对于网络传输上的要求也并非那么苛刻(本来是有机会进入网络编程这个大坑的,但业务场景的限制,我并没有太过深入)。而图形学,尤其是三维图形,真的很深。从线性代数,数值统计,到 OpenGL, Shader, 图形算法,每一项都需要很长时间的投入。</p>
</blockquote>
<p>对于第二家公司,我主要跪在下述问题:</p>
<ol>
<li>你研究图形,有没有封一个库?喜欢 3D 游戏,有没有写一个?</li>
<li>D3D 了解?熟悉?(微软各种技术我从头到尾都摸过了,唯独这个 D3D,泪流满面)</li>
<li>OpenGL 深入到什么程度了,给我讲讲 glxxx, glxxxx, glxxxxx. Shader 写过多复杂的?光照模型?光线追踪?</li>
</ol>
<p>而更惨的是,由于是零基础进入图形组,所以近一年做的活的确不够高端,都偏基础(其实还是很感谢我领导的,让我有一个循序渐进的过程)。所以导致这段经历并不出彩,尤其和采集那段没法比,把这个小辫子揪出来说道说道,必然悲催。</p>
<hr>
<p>综上,我感觉什么阶段就应该做什么事情。你是一个学生,就应该把该看的书都看了,从 C++ Primer, 到 CLRS,一个也别放过,认真看,习题也认真做。这些都是内功,是练习乾坤大挪移的基础。如果你已经工作,那么基础知识的补习就算一件比较奢侈的事情了。你更应该在工作中加强自己的实践能力,一层一层的突破乾坤大挪移的境界。分清主次,避免分散精力就变得异常重要。</p>
<blockquote>
<p>总结来说:内功决定你能走多远,经验决定你能走多快。</p>
</blockquote>
<h2 id="未来计划">未来计划</h2><p>自从 <a href="summary-2014">2014</a> 年发现自己基础不足之后,我就将重心极大程度的向重温本科知识上偏移。从 <em>C++ Primer</em> 到 LeetCode, 甚至更加关注数据结构与算法方面。但我并未意识到这些事情的迟来与不合时宜所带来的代价。也许两次面试很难说明问题,但至少也可以看出一点端倪。</p>
<blockquote>
<p>开复老师的话是对的,即使有了工作,也要在招聘旺季去尝试找工作,它真的能让你体会到很多事情。如你是否把握住了自己的发展方向、目前公司到底有多少优劣、你渴望的是怎样的工作环境、以及你目前技术处于什么水平等。不断面试的历练能让你更清醒的认识自己,更迅速的调整自己。</p>
</blockquote>
<p>知乎上常常见到面试受挫的应届生发牢骚的帖子,其实没有太大必要那么较真。我本人是很享受这个过程的,如果 BATFLAG 愿意给我面试机会,我也想去试试呢。(毕竟我还没遇到真正让我折服的 C/C++ 高手,实在有点心有不甘)</p>
<p>就我自身而言,图形学仍然是我最应该尝试的方向。目前公司给我一个非常非常宽松的研究环境,我有大把的时间供自己支配。这是一个我以前并未注意的机会(毕竟人类总是容易忽视已经到手的东西...)。我尝试调整自己接下来努力的方向(排名分先后):</p>
<ol>
<li>更加认真的对待工作中每一项任务。(这个的确还是最锻炼人)</li>
<li>将图形学所需的基础技能点补全:线性代数(数学库) -> API(OpenGL, D3D) -> 深入底层(光栅、光照) -> 实际应用(建模、游戏)</li>
<li>重视实践,动手写一些有意思的东西</li>
<li>更节省的(偷偷的)补基础:算法导论</li>
<li>填坑:C++ Primer 与 LeetCode. (酌情考虑)</li>
</ol>
<p>PS: 最后还有一点改变,就是不再写读书笔记了,按王月的话说,"我越来越像一个书贩子了"。为了读书而读书没有意义,效果也不大。我觉得读书的目的还是为了刺激思考。</p>
<blockquote>
<p>记录本身毫无意义,记忆在搜索时代也慢慢退场。一切为了<strong>解决问题</strong>,一切为了思考<strong>本质</strong>,一切为了<strong>创造</strong>。</p>
</blockquote>
<p><strong>不畏浮云遮望眼,只缘身在最高层。</strong></p>
]]>
</content>
</entry><entry>
<title type="html"><![CDATA[几点反思(一)]]></title>
<link href="talk/introspection1"/>
<published>2015-01-08T00:00:00.000Z</published>
<updated>2015-01-08T00:00:00.000Z</updated>
<id>talk/introspection1</id>
<content type="html" xml:base="" xml:lang="en">
<![CDATA[ <h2 id="有序-well-organized">有序(well-organized)</h2><p>不知道大家对这个词是怎么理解的, 我的理解很简单, 就是"按部就班", 按照"To-do list"一件一件的做事。</p>
<p>以我自身来说, well-organized 的一天就是: 早上迅速写完 LeetCode 的每日一题, 然后进入日常工作状态, 晚上吃完饭, 下班后, 看一会 C++ Primer 5th , 然后写习题答案. 如果还有时间, 就看看别的技术.</p>
<p>由于我是按照 LeetCode 的通过率从高到低来做题的, 所以进展到现在, 题目的难度已经让我有点 Hold 不住了, 我在上面花费的时间呈线性增长. 按照上面的顺序, 这无疑影响了正常工作的内容.</p>
<hr>
<p>这里打断一下说另外一件事, 关于思维习惯的.</p>
<p>几天前, 与<a href="http://www.douban.com/people/75874962/">@王月</a>有一次深入的交流, 意外发现我和他处理问题的方式截然不同, 如果同时面对一个难题:</p>
<ul>
<li>他会投入一段时间, 如果没有什么进展, 他会先放在一边, 继续做别的事情<sup><a href="#reference">1</a></sup>.</li>
<li>我会死磕到底.</li>
</ul>
<p>我从来没意识到自己这样有什么不妥, 虽然会花费大量时间, 但我的确鲜有未曾解决的问题. 我死磕的过程是这样的:</p>
<ol>
<li>凭借自己的知识解决, 如果解决不了, 进入2</li>
<li>凭借对问题背景的理解, 以及自己的见识, 找到相关书籍, 翻阅相关章节, 如果完全在知识边界之外, 进入3</li>
<li>疯狂的 Google 搜索, 毫不夸张, 一般是10+的Tab页. 如果找到线索, 进入4, 否则进入5</li>
<li>根据线索, 尝试, 猜测, 比较不同的线索, 推理. 这个过程比较耗时, 运气好往往能够解决问题. 没解决进入6</li>
<li>该问题好像别人根本没遇到过一样, 优化关键字, 重组搜索策略, 譬如利用语言, 时间, 图片筛选. 这个步骤考验英语能力, 好的英语能够准确的帮助分词以及组合. 然后进入4</li>
<li>基本属于没辙了, 但不愿放弃, 茶不思饭不想, 脑子里时不时就会捡起来考虑. (但这会严重占用脑 CPU, 导致其他工作收到影响)</li>
</ol>
<p>那么总结一下, 我这种方式有什么优劣?</p>
<p><strong>PROS</strong></p>
<ul>
<li>不惧怕新事物, 曾经遇到 <code>octopress</code> 以及 <code>CSS</code> 等一些我完全没有知识背景的问题, 也能顺利解决.</li>
<li>解决问题的过程中, 经常无意间发现更广阔的天地, 如好资源, 好社区, 某大牛等. 容易自然而然的开阔眼界.</li>
<li>加深对一些知识的理解, 突破自己的局限. (发现某些问题自己以为无法解决, 但是却被别人解决了)</li>
<li>不留问题在心中, 解决掉的那一刹那, 无比舒爽, 利于保持愉快的心情.</li>
</ul>
<p><strong>CONS</strong></p>
<ul>
<li>浪费时间, 得不偿失. 更多情况下, 是花了很多时间, 却未找到答案.</li>
<li>容易分心, 死磕的时间一长, 搜索的面一广, 容易把注意力分散到别的上面去了. 引入更多的问题, 如想调整 VIM 里 <code>Tab</code> 的空格数, 却发现一款好看的配色, 立刻又想试试.</li>
<li>顾此失彼, 不分轻重. 不是所有问题都值得死磕的, 因为一些暂时不重要的问题死磕, 导致此时此刻重要的问题得不到解决, 会造成更大的麻烦, 平添不必要的压力.</li>
<li>有时候解决不了是因为知识储备不够, 如分明没有系统的学过 move 语义, 偏偏硬是要从人家的代码里理解透它. 这种死磕可谓不自量力.</li>
</ul>
<p>可以发现, 死磕的方式, 本质上是一种类似枚举的线性思维, 可以解决大量问题, 但容易 TimeOut. 随便在 Github 上搜索一下 LeetCode 的解题代码, 很多人都用这种方式刷题, 说白了就是不管三七二十一, 解决了问题就行.
代码丑一点, 乱一点, 用点笨办法, 也不要紧.</p>
<p>反观王月的方式, 会不会觉得很熟悉, 像不像领导对你的工作安排? 无论是开发项目, 还是研究产品, 项目经理都会对整体进度进行把控, 分配给你的任务, 不会没有deadline, 更不会无休无止, 放任自流.
一旦你耗时过多, 或非常费力, 他就会找别的方法, 或是 kill 掉这个功能, 或是找更加擅长的同事来代替你. 而此时的你会作如何感想? 会有点不服气? 但也有点松了一口气?</p>
<p>为什么项目经理能够立刻做出与<strong>问题本身</strong>无关的决策? 因为他是站在整个项目的角度去考虑问题的. 而<strong>时间成本</strong>是项目成本中很大的一环. 作为开发者, 盯着自己的一亩三分地, 显然是不会着眼于整个大局的.</p>
<p>回到个人, 王月就像是管理一个项目一样管理自己的生命<sup><a href="#reference">2</a></sup>, 而我更像是个作坊里的小工, 闭门造车, 无心世事.</p>
<p>从这个思维差异可以看出来, 从某个单一的角度去看待某个问题, 往往会得到一个非常片面的解决方案. 正如我上面举的例子, 同一道 LeetCode 题, 笨办法与巧办法将其解出, 带给人的收获可能差别非常大.</p>
<p>就好比同一个问题, 我和王月都解决了, 可我花费更多的时间, 他花费更少的时间. 我俩的效率就差了一个档次. 长此以往, 就会慢慢拉开差距了.</p>
<hr>
<p>为什么说有序, 却扯出这么大一个别的话题? 因为可以举一反三.</p>
<p>我理解的有序, 目的落在了"序"上, 为了"次序"而"次序". 正如我为了得到"问题的解", 而解决问题, 更具体的, 我为了刷 LeetCode, 所以不顾方法, 只为了 "AC". 这显然是比较片面的理解.</p>
<p>结合多个方面去思考, 考虑时间, 环境, 情况, 甚至自我状态, 情绪, 身体状况等等, 合理的<strong>安排/调整</strong>"次序", 才是对于"有序"更高层次的理解.</p>
<p>假如今天的 LeetCode 比较难, 早上地铁里没想出啥办法, 到了公司要死磕吗? 若此时恰好对工作上某一个难题有了好点子呢? 我需要执着于这个"次序", 而强扭着先解决 LeetCode 再弄工作吗?</p>
<p>还是那句话, 这一天可能结果都是干了那么三件事, 但经过合理安排的有序, 一定比严格遵守次序的有序, 过得更轻松, 惬意.</p>
<hr>
<p>下次再说说其他几个词.</p>
<h2 id="reference">Reference</h2><ul>
<li>[1] : 这个习惯可以从很多方面看出来,如在<a href="http://www.zhihu.com/question/20824615/answer/21783520">这个回答</a>里他在面对问题与疑惑时采取进退的策略.</li>
<li>[2] : <del>他的经历会让他做出决策时更谨慎,如他曾赞同的<a href="http://www.zhihu.com/question/26724212/answer/33800406">一个回答</a>里所说: "已经没有犯错的余地了,每一步必须走得很准才行".</del> 此处有误,仅仅是我观察的结果。</li>
</ul>
]]>
</content>
</entry><entry>
<title type="html"><![CDATA[2014年终总结]]></title>
<link href="talk/summary-2014"/>
<published>2014-12-30T00:00:00.000Z</published>
<updated>2014-12-30T00:00:00.000Z</updated>
<id>talk/summary-2014</id>
<content type="html" xml:base="" xml:lang="en">
<![CDATA[ <p>从 2012 年开始,我便开始每年都写年终总结,去年东施效颦某些前端大牛,将一篇洋洋洒洒的总结写在了 Github 的 issue 里,随着某次情绪不稳定,删掉了该 repo 之后,才发现 issue 并不提供 git 机制,悔恨不已。</p>
<p>从而莫名其妙的丢掉了一年的总结,每每想到这件事,就感觉仿佛 2013 年未曾活过一般。</p>
<p>但实际上,2013 年也的确没有 <a href="end-of-2012">2012 年</a>那么曲折,也没有 2014 年这般炼狱。</p>
<p>何谓炼狱?说来话长,今年大体可分为两个阶段:</p>
<ol>
<li>继续给<a href="thinking-of-das">采集</a>擦屁股</li>
<li>进入<a href="needdepth">三维图形</a>领域</li>
</ol>
<p>第一阶段,恰为上半年,约莫到4月中旬;第二阶段从5月开始,直到年末。</p>
<p>如果说去年对于<a href="thinking-of-das">数据采集</a>的总结,达到了我个人对于这部分工作理解之高峰的话,后续的工作只能称得上是一路滑向山谷。这也是当一个软件逐步做大,参与的人员逐步变多,所带来的必然结果。</p>
<p>第一版与第二版,几乎是我一个人把控,只需要做好 <strong>KISS</strong> 的原则即可。而到了第三版,领导决定对其增加许多额外的功能与职责,并举全组之力,希望其能够称之为一个完整的解决方案,坚持 <strong>KISS</strong> 就显得有些不切实际了。</p>
<p>只记得在 2013 年 10 月到 12 月份,无尽的讨论并未产生良好的设计,而是诞生了一个不断妥协的结果:与上层接口的妥协,与调用方的妥协,与领导的妥协,与行业经典软件的妥协。可以想象这样一个怪东西会有怎样的结局了。</p>
<p>所以到了 2014 年,我过足了"设计的瘾",开始回归到具体实现上来了。说说接触到的一些新的尝试:</p>
<ol>
<li>在 MFC 中,界面美化一直是一个繁复的过程,我时常倾羡一些成熟软件的外观,直到我看到了<a href="http://blog.sina.com.cn/s/blog_a6fb6cc90101g0p8.html">这篇文章</a>。从此发现 Qt 的威力,模仿并草创了采集的主体界面。</li>
<li>如何实现 C/S 程序与 B/S 程序的交互?(也可以理解为 C++ 与 Java Web 的交互),我接触到了<a href="http://www.cs.fsu.edu/~engelen/soap.html">gSOAP</a>,明白了如何用 C++ 来写 Web Service.</li>
<li>几个小玩意:C/S 集成页面,即集成多个 exe 到一个应用中;单位换算机制,即公制-英制-自定义单位的快速转换。</li>
<li>丰富 DAS 采集框架,主要完善消息总线的设计,尽可能的简化结构,去除不必要的内部消耗。这里面我温习了不少设计模式的知识,深入了解了观察者模式与工厂系的模式。</li>
</ol>
<p>其余的工作便是改 Bug,完善底层架构,改 Bug,完善。。。</p>
<p>这个阶段应该算是对三年采集工作的一次梳理和总结,另外也尝了 Qt 的鲜,真正做到了<a href="about-collector">彻底摆脱 MFC</a>,同时了解了一些关于 Web Service 协议的东西。</p>
<p>这个阶段,我应该算是全力扑在了工作上,但由于工作中需要将以往的仪器的适配 DLL 全部从 C++ 改为纯 C 语言,所以业余时间我也开始重读 <a href="http://book.douban.com/subject/1139336/">C 程序设计语言</a>,第一次开始认真做习题。</p>
<hr>
<p>第二阶段,实际从 3 月份即开始蠢蠢欲动了,但直到 4 月中旬这事才板上钉钉,那次 <a href="needdepth">工作变动</a> 对我真的影响很大。我开始比较正式的学习 Qt 与 OSG,从 2D 绘图开始,到 3D 中画出第一个球体。</p>
<p>这部分经历记忆犹新,不同于以前应用软件设计的领域,图形学对我来说,真的是完全陌生。其中的压力与艰辛,实在只能意会不可言传。也正是从那时起,我开始混迹知乎,读 <a href="http://book.douban.com/subject/3173123/">C++ GUI Qt4编程</a>。</p>
<p>期间慢慢适应了新的工作环境,但也遭遇了史上最低的一次绩效考核,情绪波动很大,很长时间里非常自暴自弃,认定自己是个 loser,现在想想有些可笑,但负面的情绪不仅影响了工作热情,也影响了生活,甚至影响了与女友的关系。</p>
<p>而一次非常意外的<a href="https://gist.github.com/pezy/9ecd15a4ab7a543f02bc">脑子犯二经历</a>,让我重新捡起了 <a href="http://book.douban.com/subject/24089577/">C++ Primer</a> 这本神奇的书。</p>
<p>又让我知道了王月的那个<a href="https://github.com/Mooophy">习题答案的 repo</a>,于是约莫从八月开始,我便开始认真阅读该书,并尽量完整的补充<a href="https://github.com/pezy/Cpp-Primer">习题答案</a>。</p>
<p>最初,这件事对于我的意义可能只是烦闷工作的一个消遣,也同时能够满足我长期以来跃跃欲试的"编纂情节",我曾为其设计了漂亮的 web 页面,包括设置了评论框,连字体、CSS 样式,都是花过心思的。</p>
<p>但后来随着我越来越深入的了解 C++ 11 的新规范,才发现了一个全新的世界,并清晰的看到自己基础的薄弱。以至于后来我撤掉了华丽的 web 页面,踏踏实实的研究 C++ 本身,并从始至终的贯彻书中作者无意间提到的一句名言:</p>
<blockquote>
<p>Brevity Can Be a Virtue</p>
</blockquote>
<p>也是从那时起,我开始打理<a href="http://www.douban.com/people/pezy/">我的豆瓣主页</a>, 粗略的模仿王月的读书进度条(现在已经撤掉了),并开始写 C++ Primer 的读书笔记。</p>
<p>正如我在<a href="http://www.zhihu.com/question/19599607/answer/28751194">某个答案</a>的最后所说,我始终相信,能够啃下大砖头的人,必然是人中龙凤,而我当时竟没曾预料到这么快就遇上了一个。</p>
<p>这对于我有很大的触动,于是,很庆幸,我没有再一次中途放弃,而是坚持将这个计划继续了下去。虽然进展很缓慢,截止到今天,整整 4 个月,我才进展到 12 章,其中有过烦闷,欢心,自怨,骄傲,等等心绪。</p>
<p>有了第一次义无反顾的坚持,第二次便来的很容易,从 10 月 15 日开始,我开始每天一道 <a href="https://github.com/pezy/LeetCode">LeetCode</a>,起初这也只是一种好奇驱动而已。</p>
<p>但随着题量的提升,涉及到数据结构、算法等等一系列知识时,我才真正的明白面试题的意义(以往我是对此深恶痛绝的)。做这个的时候我也是无意间列了一个<a href="https://github.com/pezy/LeetCode#leetcode">时间表</a>,</p>
<p>而截止到今天,我竟然依然按照该表在执行。</p>
<p>上述两件事,对于其他人并没有什么太大的意义,但对于我来说,却是非常大的改变。<strong>我从来就不是一个善于坚持的人</strong>,有生以来,我唯一坚持做下来的事情,也许就是上述两件了。</p>
<p>这对于 C++ 、数据结构、算法的学习可能微不足道,而对于个人修身的影响却是巨大的。<a href="http://macshuo.com/">MacTalk</a> 的池大大曾表示,每天坚持写 MacTalk ,看似是一件小事,却非常的不易。我也是至今才能够深刻体会。</p>
<p>更不用说这两件事带给我其他的好处了,捡重点说两个吧:</p>
<ol>
<li>我已经离不开 Github 了,并在上面认识了很多厉害的朋友。</li>
<li>我竟然开始学着使用 StackOverflow 了,长期以来我都是该站的得益者,今年我成为了一个贡献者。</li>
</ol>
<p>另外的一些变化还在于:</p>
<ul>
<li>我越来越不喜欢夸夸其谈,喜欢用代码说话,可以看到知乎上我早期的答题都是谈经验,后来都是直接拼代码,后者是需要勇气的,因为是毫不遮掩的接受大家的批评。</li>
<li>我从忽略C++基础语法问题,到后来非常喜欢回答C++基础语法问题,再到现在不愿花功夫回答基础语法问题。(倒是有点看山不是山的感觉)</li>
<li>我从喜欢刷微博刷知乎,变的喜欢刷 StackOverflow 和 segmentfault,当然后者并未发展起来,但我已经贡献了许多答案了。</li>
</ul>
<p>相比之下,这个阶段我的工作倒是显得不怎么出彩了,期间重点研究的 LOD 与 <a href="../tech/octree-note">Octree</a> 问题到现在也没有太多的头绪,倒是因为解决了几个其他的三维显示问题,从而拿到了公司内部的一个小奖(技术达人)。</p>
<p>其奖金还算丰厚,也弥补了一点绩效不好看的遗憾。</p>
<hr>
<p>最后一部分总结,要留给一直陪伴我的女友。今年我们一起走过了<a href="http://pezy.github.io/love">相识的第二个年头</a>。上面提到的那本 C++ Primer 5th 的英文原版,就是她从英国给我带回来的,很惭愧,那时国内该书还未曾有中文版,</p>
<p>而她得知我是搞 C++ 的,便偷偷给我买了此书,那时我便发誓要将此书读个通透,没想到今年才开始行动。也是她,帮助我克服了对于大部头英语的恐惧,对于英语书写的恐惧,甚至是口语上的恐惧。</p>
<p>我想,英语对于一个程序员的意义,是不言而喻的。同理,她对于我的意义,也是无法估量的。</p>
<p>生活里的我向来笨手笨脚,这一点给她带来了不少烦恼。她是一个在生活上很会花心思的人,而我则基本是个执着的工作狂,如此直接的矛盾,给我俩带来了不少争吵,最终都以我死皮赖脸的道歉结束。</p>
<p>后来我们曾沟通多次,我才逐渐开始意识到自己这样"忙碌"的生活本质上是一种无序的混乱以及思维的懒惰。我开始关注极简主义,开始逐步砍掉一些无意义的事情。这对于我来说,算是一个不小的考验,毕竟积习难改。</p>
<p>但我已将之作为我明年的目标。规律化的生活,分配好各项事宜的时间,应该算是一项成熟的标志。</p>
<p>她对我的影响,往往是润物细无声的,从穿着打扮,到饮食习惯,再到对品质的追求。而最大的影响,是让我看到了更大的世界,听到了更多不同的声音,从以往的一意孤行,到现在的包容并蓄,这都是她给我带来的宝贵财富。</p>
<p>我的蠢笨与她的聪颖,以及完全截然不同的两种性格,竟然走到一起两年之久,也不得不叹服缘分的力量了。</p>
<p>最后,虽然有很多现实问题摆在我俩面前,但我还是希望今年能够缘上加缘,携手组建一个温馨的家庭。</p>
<hr>
<p>今年的吃过的亏很多,教训也很多,主要体现在以下几条:</p>
<ol>
<li>注意<strong>时间陷阱</strong>,要善于给自己设置时间节点,切记不要无休无止。</li>
<li>注意判断<strong>取舍</strong>,什么该做,什么不该做,有自己的标准。这一点直接影响上面的时间陷阱。</li>
<li>注意<strong>读书方法</strong>,第一遍尽量利用(kindle + 闲散时间),标记重点;第二遍针对重点温习;然后实践中验证。</li>
<li>注意<strong>抓住本质</strong>,学习不是为了克服遗忘,而是为了遗忘。遗忘形式上的东西,把握核心本质。</li>
<li>注意<strong>归纳总结</strong>,今年的总结还是不够,总结代表思考,不经总结的学习,像是用漏斗乘沙。</li>
<li>注意<strong>还是坚持</strong>,坚持带来的最大的好处,是心态的稳定,不以物喜,不以己悲,按部就班做好该做的。</li>
</ol>
<p>这是今年仍有欠缺的地方,明年继续努力。</p>
<hr>
<p>明年学习计划:</p>
<ul>
<li>力求在 3 月底,完成 <a href="https://github.com/pezy/Cpp-Primer">C++ Primer</a> + <a href="https://github.com/pezy/LeetCode">LeetCode</a> 两个项目</li>
<li>力求在上半年,完成对线性代数及相关数学知识的复习,并牢固掌握 OpenGL 的基础知识。</li>
<li>多一个坚持:每周一篇技术博客。</li>
<li>力求在年底前,看完三本书:CSAPP + SICP + CLRS</li>
<li>学历提升,与换工作,二选一。</li>
<li>可选:<ul>
<li>借 WebGL,深入学习 JavaScript</li>
<li>几个 MIT 的课程</li>
<li>学习 python.</li>
</ul>
</li>
</ul>
]]>
</content>
</entry><entry>
<title type="html"><![CDATA[使用八叉树管理场景对象]]></title>
<link href="tech/octree-note"/>
<published>2014-09-15T00:00:00.000Z</published>
<updated>2014-09-15T00:00:00.000Z</updated>
<id>tech/octree-note</id>
<content type="html" xml:base="" xml:lang="en">
<![CDATA[ <blockquote>
<p>声明: 本文翻译自<a href="http://t.cn/Rhi9Dj7">OpenSceneGraph 3 Cookbook</a>中的Chapter 8某小节, 更多内容请购买该书查看.
以下内容仅供学习之用, 禁止转载. 如有翻译错误之处, 请通过评论告之.</p>
</blockquote>
<p>在最后一个章节, 我们花了大量的时间讨论VPB地形模型的结构, 并且已经对四叉树场景图比较熟悉了.
在LOD和paged LOD的帮助下, 我们可以用四叉树算法快速地管理地形板块, 无限制的渲染地形数据.
事实上, 许多其他的应用也在处理海量数据时, 选用四叉树来管理场景, 例如城市建筑, 人群, 网络拓扑等.
一个四叉树的内部节点恰好包含四个子节点, 所以它非常擅长管理XOY平面上的对象.</p>
<p>那么如果我们要分割的是三维空间, 该怎么做呢? 例如, 如果我们有大量的球体随机的分布在三维空间里,
应该使用一种高效的空间索引算法来管理它们呢? 有一种解决方案叫做<strong>八叉树</strong>. 这是另一种树状结构,
其内部节点(3D区域)恰好有八个子区域, 如下图所示:</p>
<p><img src="octree_note/octree.png" alt=""></p>
<p>VPB使用一个二维的四叉树来组织地形, 类似的我们可以使用三维的八叉树来组织体数据或复杂场景(例如太阳系中的大量行星).
在这个方案中, 我们将使用LOD节点来构造这样一个八叉树结构, 来渲染海量的球体元素. 这些球体将大小不一的随机分布在三维空间里.</p>
<h2 id="实例剖析">实例剖析</h2><ol>
<li>引入必要的头文件<div class="highlight"><pre><code class="cpp"><span class="preprocessor">#include <osg/PolygonMode></span>
<span class="preprocessor">#include <osg/ShapeDrawable></span>
<span class="preprocessor">#include <osg/Geometry></span>
<span class="preprocessor">#include <osg/Geode></span>
<span class="preprocessor">#include <osg/LOD></span>
<span class="preprocessor">#include <osgDB/ReadFile></span>
<span class="preprocessor">#include <osgUtil/PrintVisitor></span>
<span class="preprocessor">#include <osgViewer/ViewerEventHandlers></span>
<span class="preprocessor">#include <osgViewer/Viewer></span>
<span class="preprocessor">#include <iostream></span>
<span class="preprocessor">#include <fstream></span>
<span class="preprocessor">#include <sstream></span></code></pre></div></li>
<li>首先声明一个<code>OctreeBuilder</code>类, 它将使用<strong>八叉树</strong>算法来构造一个场景图.
使用<code>setMaxChildNumber()</code>方法设定一个叶子节点中包含多少个geometries(默认为16个).
使用<code>setMaxTreeDepth()</code>方法设定八叉树最大层次数目(默认为32个).<div class="highlight"><pre><code class="cpp"><span class="keyword">class</span> OctreeBuilder
{
<span class="keyword">public</span>:
OctreeBuilder() : _maxChildNumber(<span class="number">16</span>), _maxTreeDepth(<span class="number">32</span>), _maxLevel(<span class="number">0</span>) {}
<span class="keyword">int</span> getMaxLevel() <span class="keyword">const</span> { <span class="keyword">return</span> _maxLevel; }
<span class="keyword">void</span> setMaxChildNumber( <span class="keyword">int</span> max ) { _maxChildNumber= max; }
<span class="keyword">int</span> getMaxChildNumber() <span class="keyword">const</span> { <span class="keyword">return</span> _maxChildNumber; }
<span class="keyword">void</span> setMaxTreeDepth( <span class="keyword">int</span> max ) { _maxTreeDepth = max; }
<span class="keyword">int</span> getMaxTreeDepth() <span class="keyword">const</span> { <span class="keyword">return</span> _maxTreeDepth; }
<span class="keyword">typedef</span> <span class="built_in">std</span>::pair<<span class="built_in">std</span>::<span class="built_in">string</span>, osg::BoundingBox> ElementInfo;
osg::Group* build( <span class="keyword">int</span> depth, <span class="keyword">const</span> osg::BoundingBox& total,
<span class="built_in">std</span>::<span class="stl_container"><span class="built_in">vector</span><ElementInfo></span>& elements );
<span class="keyword">protected</span>:
osg::LOD* createNewLevel(<span class="keyword">int</span> level, <span class="keyword">const</span> osg::Vec3& center, <span class="keyword">float</span> radius);
osg::Node* createElement(<span class="keyword">const</span> <span class="built_in">std</span>::<span class="built_in">string</span>& id, <span class="keyword">const</span> osg::Vec3& center,
<span class="keyword">float</span> radius );
osg::Geode* createBoxForDebug(<span class="keyword">const</span> osg::Vec3& max, <span class="keyword">const</span> osg::Vec3& min);
<span class="keyword">int</span> _maxChildNumber;
<span class="keyword">int</span> _maxTreeDepth;
<span class="keyword">int</span> _maxLevel;
};</code></pre></div></li>
<li><code>build()</code>方法将被递归的调用, 来创建八叉树的每一层级. 调用时可以将深度设为0, total指定为包围球,
elementes包含巨大场景中的全部元素.<div class="highlight"><pre><code class="cpp">osg::Group* OctreeBuilder::build(<span class="keyword">int</span> depth, <span class="keyword">const</span> osg::BoundingBox& total,
<span class="built_in">std</span>::<span class="stl_container"><span class="built_in">vector</span><ElementInfo></span>& elements)
{
...
}</code></pre></div></li>
<li>我们用两个长度为3的数组来计算区域的基本属性. <code>s[]</code>表示八叉树每一个层次的全部八个元件. 数组中的值只能为0或1,
用此来描述每个元件是在X/Y/Z三个轴的左边还是右边. <code>extentSet[]</code> 记录了这个层次区域的最小, 中间, 最大的点坐标,
它后续将用来计算其孩子节点的区域.<div class="highlight"><pre><code class="cpp"><span class="keyword">int</span> s[<span class="number">3</span>]; <span class="comment">// axis sides (0 or 1)</span>
osg::Vec3 extentSet[<span class="number">3</span>] = {
total._min,
(total._max + total._min) * <span class="number">0.5f</span>,
total._max
};</code></pre></div></li>
<li><code>elements</code>包含了场景中的全部元素, 因此我们可以找出那些在当前区域<code>total</code>中, 并将它们存储在一个临时列表(<code>childData</code>)里.
如果当前区域的元素少到仅能组成一个叶子节点, 将<code>isLeafNode</code>设为true. 否则设为false, 以继续将区域细分为下一个层次的8个子节点.<div class="highlight"><pre><code class="cpp"><span class="built_in">std</span>::<span class="stl_container"><span class="built_in">vector</span><ElementInfo></span> childData;
<span class="keyword">for</span> ( <span class="keyword">unsigned</span> <span class="keyword">int</span> i=<span class="number">0</span>; i<elements.size(); ++i )
{
<span class="keyword">const</span> ElementInfo& obj = elements[i];
<span class="keyword">if</span> ( total.contains(obj.second._min) && total.contains(obj.second._max) )
childData.push_back( obj );
<span class="keyword">else</span> <span class="keyword">if</span> ( total.intersects(obj.second) )
{
osg::Vec3 center = (obj.second._max + obj.second._min) * <span class="number">0.5f</span>;
<span class="keyword">if</span> ( total.contains(center) )
childData.push_back( obj );
}
}
<span class="keyword">bool</span> isLeafNode = <span class="keyword">false</span>;
<span class="keyword">if</span> ( (<span class="keyword">int</span>)childData.size()<=_maxChildNumber || depth>_maxTreeDepth )
isLeafNode = <span class="keyword">true</span>;
osg::ref_ptr<osg::Group> group = <span class="keyword">new</span> osg::Group;
<span class="keyword">if</span> ( !isLeafNode )
{
...
}
<span class="keyword">else</span>
{
...
}</code></pre></div></li>
<li>如果<code>isLeafNode</code>为假, 我们将不得不建立包含了八个新的子区域的下一层次区域盒.
这些子区域使用<code>osg::Group</code>创建, 并加到父节点中. <code>build</code>方法将通过不同的区域参数被递归地调用,
用以检查和建立子图.<div class="highlight"><pre><code class="cpp">osg::ref_ptr<osg::Group> childNodes[<span class="number">8</span>];
<span class="keyword">for</span> ( s[<span class="number">0</span>]=<span class="number">0</span>; s[<span class="number">0</span>]<<span class="number">2</span>; ++s[<span class="number">0</span>] )
{
<span class="keyword">for</span> ( s[<span class="number">1</span>]=<span class="number">0</span>; s[<span class="number">1</span>]<<span class="number">2</span>; ++s[<span class="number">1</span>] )
{
<span class="keyword">for</span> ( s[<span class="number">2</span>]=<span class="number">0</span>; s[<span class="number">2</span>]<<span class="number">2</span>; ++s[<span class="number">2</span>] )
{
osg::Vec3 min, max;
<span class="keyword">for</span> ( <span class="keyword">int</span> a=<span class="number">0</span>; a<<span class="number">3</span>; ++a )
{
min[a] = (extentSet[s[a] + <span class="number">0</span>])[a];
max[a] = (extentSet[s[a] + <span class="number">1</span>])[a];
}
<span class="keyword">int</span> id = s[<span class="number">0</span>] + (<span class="number">2</span> * s[<span class="number">1</span>]) + (<span class="number">4</span> * s[<span class="number">2</span>]);
childNodes[id] = build(depth+<span class="number">1</span>, osg::BoundingBox(min, max), childData);
}
}
}
<span class="keyword">for</span> ( <span class="keyword">unsigned</span> <span class="keyword">int</span> i=<span class="number">0</span>; i<<span class="number">8</span>; ++i )
{
<span class="keyword">if</span> (childNodes[i] && childNodes[i]->getNumChildren())
group->addChild( childNodes[i] );
}</code></pre></div></li>
<li>如果当前节点可作为八叉树中的叶子节点, 我们只要调用<code>createElement()</code>来生成球体并设置一些必要的参数来渲染它.
这些可渲染的元素将被加到<code>osg::Group</code>中, 用以呈现八叉树的叶子节点.<div class="highlight"><pre><code class="cpp"><span class="keyword">for</span> ( <span class="keyword">unsigned</span> <span class="keyword">int</span> i=<span class="number">0</span>; i<childData.size(); ++i )
{
<span class="keyword">const</span> ElementInfo& obj = childData[i];
osg::Vec3 center = (obj.second._max + obj.second._min) * <span class="number">0.5</span>;
<span class="keyword">float</span> radius = (obj.second._max - obj.second._min).length() * <span class="number">0.5f</span>;
group->addChild(createElement(obj.first, center, radius));
}</code></pre></div></li>
<li><code>build()</code>方法的最后一个步骤, 是使用<code>osg::LOD</code>来完成当前层次的构建. 当视线远离场景时,
它包含一个示意盒(或什么也没有)来粗略表示. 只有视线足够靠近, 才会既包含八个子节点, 又包含一些叶子节点.
其中将出现少量的球体, 这取决于<code>_maxChildNumber</code>的值了.<div class="highlight"><pre><code class="cpp">osg::Vec3 center = (total._max + total._min) * <span class="number">0.5</span>;
<span class="keyword">float</span> radius = (total._max - total._min).length() * <span class="number">0.5f</span>;
osg::LOD* level = createNewLevel( depth, center, radius );
<span class="comment">// For debug use</span>
level->insertChild( <span class="number">0</span>, createBoxForDebug(total._max, total._min) );
level->insertChild( <span class="number">1</span>, group.get() );
<span class="keyword">return</span> level;</code></pre></div></li>
<li><code>createNewLevel()</code>方法用于创建自定义LOD节点.<div class="highlight"><pre><code class="cpp">osg::LOD* OctreeBuilder::createNewLevel( <span class="keyword">int</span> level, <span class="keyword">const</span>
osg::Vec3& center, <span class="keyword">float</span> radius )
{
osg::ref_ptr<osg::LOD> lod = <span class="keyword">new</span> osg::LOD;
lod->setCenterMode( osg::LOD::USER_DEFINED_CENTER );
lod->setCenter( center );
lod->setRadius( radius );
lod->setRange( <span class="number">0</span>, radius * <span class="number">5.0f</span>, FLT_MAX );
lod->setRange( <span class="number">1</span>, <span class="number">0.0f</span>, radius * <span class="number">5.0f</span> );
<span class="keyword">if</span> ( _maxLevel<level ) _maxLevel = level;
<span class="keyword">return</span> lod.release();
}</code></pre></div></li>
<li><code>createElement()</code>方法创建并返回可渲染的球体.<div class="highlight"><pre><code class="cpp">osg::Node* OctreeBuilder::createElement( <span class="keyword">const</span> <span class="built_in">std</span>::<span class="built_in">string</span>&
id, <span class="keyword">const</span> osg::Vec3& center, <span class="keyword">float</span> radius )
{
osg::ref_ptr<osg::Geode> geode = <span class="keyword">new</span> osg::Geode;
geode->addDrawable( <span class="keyword">new</span> osg::ShapeDrawable(<span class="keyword">new</span>
osg::Sphere(center, radius)) );
geode->setName( id );
<span class="keyword">return</span> geode.release();
}</code></pre></div></li>
<li><code>createBoxForDebug()</code>将创建一个线状的盒子, 用于表示区域的包围盒. 它只是为了方便调试.<div class="highlight"><pre><code class="cpp">osg::Geode* OctreeBuilder::createBoxForDebug(<span class="keyword">const</span> osg::Vec3& max,
<span class="keyword">const</span> osg::Vec3& min)
{
... <span class="comment">// Please see source code for details</span>
}</code></pre></div></li>
<li>我们还实现了一个打印访问器, 可以将场景结构, 叶子球体的名称存储到文件中. 它从<code>osgUtil::PrintVisitor</code>派生而来. 足够用了.<div class="highlight"><pre><code class="cpp"><span class="keyword">class</span> PrintNameVisitor : <span class="keyword">public</span> osgUtil::PrintVisitor
{
<span class="keyword">public</span>:
PrintNameVisitor( <span class="built_in">std</span>::ostream& out ) :
osgUtil::PrintVisitor(out) {}
<span class="keyword">void</span> apply( osg::Node& node )
{
<span class="keyword">if</span> ( !node.getName().empty() )
{
output() << node.getName() << <span class="built_in">std</span>::endl;
enter();
traverse( node );
leave();
}
<span class="keyword">else</span> osgUtil::PrintVisitor::apply(node);
}
};</code></pre></div></li>
<li>我们几乎要完成了. 现在, 在主函数里, 我们将5000个大小和位置都不同的球体, 加到<code>globalElements</code>中.
同时将计算整体的包围盒. 然后, 就可以调用<code>build()</code>方法来创建顶层的八叉树图了.<div class="highlight"><pre><code class="cpp">osg::BoundingBox globalBound;
<span class="built_in">std</span>::<span class="stl_container"><span class="built_in">vector</span><OctreeBuilder::ElementInfo></span> globalElements;
<span class="keyword">for</span> ( <span class="keyword">unsigned</span> <span class="keyword">int</span> i=<span class="number">0</span>; i<<span class="number">5000</span>; ++i )
{
osg::Vec3 pos = osgCookBook::randomVector(-<span class="number">500.f</span>,<span class="number">500.f</span>);
<span class="keyword">float</span> radius = osgCookBook::randomValue( <span class="number">0.5f</span>, <span class="number">2.0f</span> );
<span class="built_in">std</span>::<span class="built_in">stringstream</span> ss; ss << <span class="string">"Ball-"</span> << i+<span class="number">1</span>;
osg::Vec3 min = pos - osg::Vec3(radius, radius, radius);
osg::Vec3 max = pos + osg::Vec3(radius, radius, radius);
osg::BoundingBox region(min, max);
globalBound.expandBy( region );
globalElements.push_back(OctreeBuilder::ElementInfo(ss.str(), region));
}
OctreeBuilder octree;
osg::ref_ptr<osg::Group> root = octree.build(<span class="number">0</span>, globalBound, globalElements);</code></pre></div></li>
<li>将生成的场景图存储到ASCII文件中, 并开启<code>viewer</code>渲染整个巨大的场景.<div class="highlight"><pre><code class="cpp"><span class="built_in">std</span>::ofstream out(<span class="string">"octree_output.txt"</span>);
PrintNameVisitor printer( out );
root->accept( printer );
osgViewer::Viewer viewer;
viewer.setSceneData( root.get() );
viewer.addEventHandler( <span class="keyword">new</span> osgViewer::StatsHandler );
<span class="keyword">return</span> viewer.run();</code></pre></div></li>
<li>当应用启动时, 视线所及仅能看到一个盒子, 随着视角的不断推进, 你将看到盒子不断细分, 推进到最后,
足够靠近那些球体时, 你将看到叶子节点中的球体也会呈现出来. 如下图所示:</li>
</ol>
<p><img src="octree_note/result.png" alt=""></p>
<h2 id="深入分析">深入分析</h2><p>如果打开输出文件(应用每运行一次都会生成), 粘贴一部分如下:</p>
<pre>osg::LOD
osg::Geode
osg::Group
osg::LOD
osg::Geode
osg::Group
Ball-438
…
osg::LOD
osg::Geode
osg::Group
Ball-729
…
osg::LOD
…</pre><p>以Ball-*为名的节点是必须在场景中渲染的球体. 从之前的代码里可以得知, 球节点存储在Group节点中(八叉树的叶子节点),
Group节点是LOD更精细的一层. LOD节点有自身的位置和半径, 并会根据中心与眼睛的距离来决定子叶子是否显示出来.</p>
<p>同一层次的每八个LOD节点会组成一个Group节点, 作为上层LOD节点更精细的一层. 这就是八叉树的实际结构.
所有LOD的粗略层都会用线框盒(osg::Geode)来表现.</p>
<h2 id="更多内容">更多内容</h2><p>你会发现用四叉树, 八叉树这样的索引算法来集成场景图并不复杂. 在这一节里, 我们仅仅用<code>osg::LOD</code>节点来管理树的不同层次,
但更好的选择应该是<code>osg::PagedLOD</code>来为巨大场景的渲染提供分页功能. 就像<strong>VPB</strong>管理地形数据库那样.</p>
<p>你可能会对一些其他的空间索引算法感兴趣, 以下是他们的介绍链接:</p>
<ul>
<li><a href="http://en.wikipedia.org/wiki/Binary_space_partitioning">二叉空间分割(BSP)</a></li>
<li><a href="http://en.wikipedia.org/wiki/K-d_tree">K-dimensional tree(KDTree)</a></li>
<li><a href="http://en.wikipedia.org/wiki/R-tree">R-Tree</a></li>
</ul>
<p>试着用这些个方法来实现场景图结构. 你不仅可以用他们来<strong>抽稀</strong>渲染对象, 还可以更快的判断场景对象与线段(或其他操作)<strong>是否相交</strong>.</p>
<p><em>-EOF-</em></p>
]]>
</content>
</entry><entry>
<title type="html"><![CDATA[读《陆犯焉识》]]></title>
<link href="talk/read-lfys"/>
<published>2014-05-22T13:46:00.000Z</published>
<updated>2014-05-22T13:46:00.000Z</updated>
<id>talk/read-lfys</id>
<content type="html" xml:base="" xml:lang="en">
<![CDATA[ <p>写于第1607页</p>
<p>我承认很可耻,我是看了电影才找来这本书的。恰好亚马逊上热卖减价,0.99元带回家,立刻一键下单。所以上面标识的页码,是kindle中的位置。</p>
<p>严歌苓应该是一位慈祥的女人。她的文风可以被八个字描述:不紧不慢,娓娓道来。也许是我比较浮躁,更偏爱有速度感的文字,所以初看之际,总觉不耐。以至于看到了第九章,才感悟出一点东西。</p>
<p>她的比喻很妙,也很怪。是那种需要你思考的怪,不直接,但想明白之后会觉得十分贴切,忍不住多看几眼。然后她的时间线安排堪称极致。从陆焉识在西北晕倒在冰天雪地,一下子跳到他在美国的风流事迹,你一点也不觉得突兀。就好象你是陆焉识,也一定会在那个时刻,回顾一生。最后,她是真的会写女人。说立体、跃然纸上,都不贴切,那是一枝笔能戳到骨头的厉害。如果早几年读,我恐怕体会不到这一点,然而谈过恋爱之后,才能洞悉作者的狡黠。</p>
<p>上面三点是我最佩服她的地方。然而"慢"才是她的最大特点。连越狱这样刺激的事情,她也只是轻描淡写,好像和平时饿顿饭、挨顿打、死个人没啥分别。有时候给我这样一个错觉:</p>
<p>陆焉识逃亡时骑的并不是好胜的青灰马,而是一头慢悠悠的小毛驴,没有什么急中生智的声东击西,倒像是随手布置的陷阱。就好象获得自由,是那么的理所当然,生怕高潮漏了出来。</p>
<p>说她到此为止,下面说一点我的思考,我的思维比较跳跃,觉得不知所云可以略过。</p>
<ul>
<li>人到底应不应该"能吃苦"?</li>
</ul>
<p>也是突然发现的,说一个人吃苦耐劳,原来并不是诚实的褒义,总带着点戏谑的成分。人应该能吃苦么?陆焉识在西北吃尽了苦,明明是一个翩翩美少年,竟成了人畜不分的一个物种。如原文这句话非常精妙:</p>
<blockquote>
<p>这点青稞搞乱了人和畜,生和死,摄取和排泄的关系。</p>
</blockquote>
<p>这样的一个转变,肯定是一场悲剧,是那种不敢细想,怕伤心的悲剧。原文中偏偏把这些惨不忍睹写成日常平淡的感觉,更让你感觉恐怖。这悲剧,是应该的么?</p>
<p>人,永远都拥有追求美好生活的权利。这是藏在这本书里的终极意义,藏的很深,藏的慢悠悠,却又会在你合书之际蹦到你脑海。还记得电影里,巩俐的问题始终没有得到答案:他为什么要跑?肯定是有原因的。我当时就非常好奇,到底是什么原因,电影里留了白,只能去原著找。噢,说的好明白,他必须要去见冯婉瑜一面,告诉她早年的误会,爱的误会。</p>
<p>等等,为什么他现在意识到了爱,为什么一定要在吃尽苦头之后?人永远是这样一种荒诞的动物,风流倜傥时,冯婉瑜算什么,爱只属于望达;不成人样时,冯婉瑜的一封信都如娇羞的少女,那娟秀的字迹就如少女的身姿。</p>
<p>这一面,不如不见,智商这样高的陆焉识竟不知道这样浅显的道理:冯婉瑜仰慕的,正是年少风流、俊秀潇洒的他。那么多封饱含深情的信件,都不是给这个吃尽苦头、非人非畜的陆焉识的。他看了信,就不要多想,只当无意间看了别人的信。可陆焉识老来忽然玩起了革命的浪漫,冒着挨枪子的风险也要越狱,要去见冯婉瑜。</p>
<p>这就合理了,让冯婉瑜不正常的不是什么不懂事的小女儿,而是聪明绝顶的陆焉识。</p>
<p>荒漠里泯灭人性的经历,是冯婉瑜这样的人无法理解的,浸泡在平淡美好生活中的人,很少闻到血真正的味道。所以当来自那个世界的陆焉识站在冯婉瑜面前时,只会把冯婉瑜的梦碎掉,人疯掉。</p>
<p>老生常谈,吃点苦头总是好处多。殊不知,吃惯了苦头,是有损人格的。越狱后的陆焉识永远也回不到过去了,他的人格已经永远的失去了。</p>
<p>或许,去见冯婉瑜只是他的一个幌子。他没有说出心里的呼声:人,永远都拥有追求美好生活的权利。他一定要去试试。见原文:</p>
<blockquote>
<p>上千个管教干部击毙了不屈的牲畜,但总有一小部分撕开缜密的猎网逃出去。那都是牲畜里的最优秀分子,勇敢强悍矫健,它们可以跳得比人头还高,跑得比子弹还快,总是在踏伤或踏死一两个人类成员之后自由地远去。</p>
</blockquote>
<p>这或许是陆焉识越狱的一个注脚。</p>
<ul>
<li>可怜,还是爱?</li>
</ul>
<p>人在得不到爱的时候,会退而求其次的追求被可怜。传统的女性正是深谙此道,严歌苓看透了这一切,躲在文字后面轻笑。陆焉识早年对冯婉瑜,恰恰就是觉得可怜。再早些,是觉得恩娘可怜。他对她们做的一切,都是基于这一个出发点。爱呢?他给了望达,那个因为不可告人的原因而羞于在大街上和他走在一起的外国女人。</p>
<p>爱,总是往上看的;可怜,才是俯视的姿态。可怜,是给予弱者的“爱”。</p>
<p>还记得高中最后一堂语文课,老师给我们留下的一句话:“男人,应该去找一个你尊敬的女人;女人,应该去找一个你仰望的男人。”看看,尊敬、仰望,合起来不就是敬仰么。你爱的人,一定是至少有一个方面让你敬仰的,无论是美貌还是才气。</p>
<p>对于沦落到一无是处的陆焉识来说,冯婉瑜那娇羞的字,已然成了他生活中最高贵的东西。</p>
<p>于是他走的义无反顾。</p>
<p>荒诞的是,对于冯婉瑜来说,这样的他,又焉识乎?</p>
]]>
</content>
</entry><entry>
<title type="html"><![CDATA[工作变动]]></title>
<link href="talk/needdepth"/>
<published>2014-05-09T00:00:00.000Z</published>
<updated>2014-05-09T00:00:00.000Z</updated>
<id>talk/needdepth</id>
<content type="html" xml:base="" xml:lang="en">
<![CDATA[ <p>记得学生时代的我,为了展示自己博览全书,在一次随笔作文里,从经史子集到西方名著,随意点评,臧否人物,不亦乐乎。老师在评语里赞扬了我一番后,留下这么一句:“你的广度有了,能否再在深度上下点功夫呢?”</p>
<p>或许是对那篇文章十分得意,以至于我对于这么一句听起来不怎么舒服的评语印象颇深。不过我不得不承认这句话戳到了我的痛处。当时,四书五经,不过是浮光掠影;莎士比亚,仅限于知道书名。看了几篇评论和介绍,就敢妄加评断,现在想想真是羞愧不已。这浮夸的种子,从那时便已经开始慢慢发芽了。</p>
<p>什么都了解,却什么都不深入。这个毛病是非常要命的,它不仅会让你花费大量时间在各个领域浅尝则止,还会让你时刻有一种自满的心态。明明是不到半瓶子的水,似乎掺点其他瓶子的盐,就会满似的。</p>
<p>发现自己已经病入膏肓,还得从近期的工作说起。</p>
<p>才工作不到三年的我,在采集团队,已经开始接触面试新员工、培训新成员的任务了。而本职工作上,无论从业务的角度、还是编程的角度上看,上升的空间也十分的狭小了(时常有种没有人比我更懂得采集的感觉)。刚开始,这种感觉会让我膨胀一会,逐渐也把自己当成专家看待了。但气球上了天,终究会爆掉。在采集模块逐渐成熟的情况下,我被分配去做一个实时数据展示的模块,它要求随着实时数据的产生,在甬道中同时绘制出曲线。开始我没觉得有多困难,毕竟有诺大的互联网不是。于是我开始调研各种技术,从微软的GDI\GDI+,DirectX,到工业标准OpenGL,再到Qt中比较有名的控件QWT。GDI\GDI+和QPaint类似,都是从点、线、面等基本元素开始组建的,而再尝试入门OpenGL的时候,我真是尝到了苦头。开始感觉有点不知所云,连环境都配置的一塌糊涂,各种警告不说,连显卡驱动我都更新了好几回。更别提有关数学的内容,时刻提醒着我考研考的一塌糊涂的数学。热心的领导给我介绍了这方面的牛人,而这位现在成为我领导的大牛给我讲解了他们在业余时间开发的一套程序。里面精妙之处不胜枚举,代码干净简洁,十分符合我的美学要求。而在2D方面,他们也仅仅用到了Qt最基本的Graphics View Framework。没有用控件,没有用其他的图形库。这的确让我开了眼界,大牛耐心的讲解也让我尝到了Qt精妙的甜头。</p>
<p>可能是井场上的程序写多了,我十分在意程序所依赖的环境,Qt和.net一样,在这上面让我天然的厌恶。.net不提,必须安装.net Framework环境。而Qt那不胜枚举的dll的也好不到哪去。另外,由于井场多以xp为主,甚至还会有2000,Qt的跨平台特性没有体现,而且还会在效率上吃亏。比起Windows API,真是不知道差了多远。</p>
<p>但那是多么狭窄的一个业务场景呢?复杂的机型,老旧的系统。除非你希望开发维护一辈子MFC,或是各种深入研究无聊透顶、名字冗长的Windows API,否则真的找不到理由将宝贵的时间浪费在这样的地方。</p>
<p>还好我在一年前就察觉了MFC的弊端,逐渐将精力放到了STL以及标准C++上去了。否则现在的处境只能更惨。Qt出现在我的视野内,也是在去年,坐在我后面的同事由于没什么活可做,百无聊赖的学起了Qt。我这才开始明白原来不用Windows这一套东西,也可以作出漂亮的界面。当时起了性子,疯狂的学了一阵子,也是浅尝辄止,毕竟想学的东西太多了。到了去年年底,领导决定<strong>再一次</strong>的重构采集系统,说到用什么来开发界面合适,我信口就推荐了Qt。而领导恰好也在别的项目上看到了Qt的成功运用。这才正式将Qt引入实际的项目开发。前期我也是兴趣盎然,又是抱着书看,又是各种分析文档。在网上看到有人模仿<a href="http://blog.sina.com.cn/s/blog_a6fb6cc90101e8lf.html">360界面</a>,简直惟妙惟肖,更是激起了我的无限乐趣。于是自作主张将这种类360风格的界面引入了最新的采集系统。我再次发挥了<strong>什么都会一点</strong>的"超能力",从图标到美工,再到细腻的界面跳转事件,以及表皮架构的设计。奠定了总体风格(貌似到现在还没有大的改变)。可惜刚刚竣工,领导就将"更重要的"后台采集框架交给了我负责。撇开"什么都会一点"的超能力,我最擅长的还真就只剩底层后台框架的设计了。于是,后续的经历再次与Qt失之交臂了。</p>
<p>缘分总是这么神奇。回到之前提到的大牛,我看了他的代码后,夜不能寐,寝食难安,原来在这样一个公司也会有这样好的代码存在!又是热心的领导遂了我的愿。在这周,我正式拜了图灵,入伙该大牛的团队里。但直到这时,Qt对于我来说,还属于"什么都会一点"中的技能点而已。</p>
<p>正经的来说,Qt对于一个人理解C++的本质,是大有裨益的。譬如我刚开始写C++程序时,连如何写一个完整的类,都是很犯愁的。而且由于中国特色,本土C++工程师往往都是披着C++外皮的C程序员。将面向对象思想贯彻的最好的,也还是Qt。所以如果你写惯了Java或是C#,再来写Qt,会很舒服。而Java Swing和Qt在界面设计方面,几乎也分不清是谁抄的谁了。也许是入门太容易,我对待Qt,至始至终都没有抱着深入学习的态度。毕竟在我心里,纯粹的C++或是纯粹的C程序才是王道。</p>
<p>于是在面对入伙后第一个"投名状"任务时,"什么都会一点"的弊端展现无疑了。能想象出来么,连在Qt Creator里对一个界面布局我都折腾了一上午。我这才发现,我对于Qt里的布局管理器竟然是一无所知的。控件的摆放,我还停留在MFC时代(也就是手动对齐)。而我看到同事绘制的界面各种拖拽、缩放自如的时候,我才意识到布局管理器的重要性。是的,从这时起,我已经开始怀疑自己无往不利的"什么都会一点"之超能力了。</p>
<p>后续需要用到的Graphics View Framework,更是让我头疼,旋转缩放函数到底是怎么使用的,为什么用起来不是我想象的那样。对着API文档看来看去,看不出所以然。看例子程序吧,额,难道没有简单点的么。算了,还是直接参考同事的代码好了,咦,他这样写的用意是什么呢。总不好意思事无巨细的去问别人吧。</p>
<p>这时候,我基本已经浮躁的无以复加了。</p>
<p>语文老师的评语,应该是从天上飘来的。“广度有了,是否在深度上下点功夫呢?”</p>
<p>我突然神经一紧,明白了老师的良苦用心。老师过于委婉的说出了对我的希望,孩子,虚心点,海里的水很深,别沉溺在小池塘里坐井观天了。</p>
<p>我删掉了那些东拼西凑准备交差的代码。重新捡起了《C++ GUI Qt4编程》,准备真正下点功夫,每一行代码的敲起。有些事,真的没有捷径。</p>
<p><em>-EOF-</em></p>
]]>
</content>
</entry><entry>
<title type="html"><![CDATA[生活的意义]]></title>
<link href="talk/thinking-in-life"/>
<published>2014-03-27T03:23:00.000Z</published>
<updated>2014-03-27T03:23:00.000Z</updated>
<id>talk/thinking-in-life</id>
<content type="html" xml:base="" xml:lang="en">
<![CDATA[ <p>大概是几天前,Jian对我说,不知道生活到底有什么意义。那时的我们走在空旷的大街上,正准备去电影院去看刚上映的《白日焰火》。</p>
<p>我当时心里却充满着意义。天天加班的乏味生活,能够抽出空来看场电影,多么有意义!如果恰碰上一场好电影,那真是生活的恩赐了。当然,我只是心里想想,如果说出来,又要遭到Jian的鄙视了。</p>
<p>今天回家,跟爸妈汇报完最近的工作窘境,反而有点失落落的。这样的工作,这样的环境,与我刚毕业时的理想相差万里,但在这不长不短的三年间,我也渐渐明白了自己所处的位置。这个世界太大,不能想当然,有太多我没见过的山,有太多我没见过的海。渺天地之一粟,毫不夸张。</p>
<p>生活的意义在我这里最终是归于荒诞的。一切都是那么合情合理,那么无懈可击。你想随口抱怨,却会在随后的深思中发现完全不应该。怨不了天,由不得人。世间万物自然生长,而偶尔交错的枝桠,却是那么的荒诞。</p>
<p>也许只是求而不得的骚动呢?人们往往是求A的时候得到了B,一拨人暗骂了一句,扔了B,继续寻求A;另一拨人觉得B也不赖,便如世事洞明般的说一句:得不到的不强求。而最幸运的那一拨,终于得到了A,若干年之后,发现A也不是自己想要的,于是蹉跎一世,悔不当初。</p>
<p>到头来,所有人都是悲剧,整个人类史就是一场悲剧的迁徙。人往往会花上一辈子去想明白自己要的到底是什么,可是时间往往饱含最大的恶意,用匆匆几年春秋,嗤笑着人类的可笑。想想就觉得荒诞。</p>
<p>我觉得生活真正的意义,都曾在我们每一个人心里暂留。只是它太过匆匆,给我们留下了完全不同的印象。我们都以为那才是真的,其实呢。</p>
<p>没有意义,也许才是最大的意义。</p>
]]>
</content>
</entry><entry>
<title type="html"><![CDATA[采集器设计思考]]></title>
<link href="talk/thinking-of-das"/>
<published>2013-11-10T00:00:00.000Z</published>
<updated>2013-11-10T00:00:00.000Z</updated>
<id>talk/thinking-of-das</id>
<content type="html" xml:base="" xml:lang="en">
<![CDATA[ <p>领导总是想一出是一出,C#的移植工作才刚刚走上正轨,便把我们叫停,还是让我们把精力放到采集模块的设计上去。</p>
<p>自我入职以来,我便一直从事着与采集相关的工作。开始我觉得这东西很神秘,很底层,可以有机会破解各类数据文件。后来渐渐觉得这是个无比简单的活计,也不会被领导重视。再后来多次重构采集框架,让我意识到,挑战无处不在。</p>
<p>采集是个什么样的概念呢?就我的工作而言,其业务场景一直局限于井场仪器实时数据的截取。钻井过程中,综合录井仪的传感器,会将各种特征参数的值测量出来,在经过一些简单的计算,形成一套实时变化的数据,因仪器类型的不同,可能会存储于本地数据库中,可能只是暂存于临时文件,更先进些的会组织成<a href="http://home.sprynet.com/~carob/index.htm">WITS</a>标准的格式,发送到总部服务器进行存储。这些实时数据,被研究的价值并不大,传回总部服务器后,也多数被绘制成实时曲线进行展示。仅此而已,也许出现井喷等事故时,可以将曲线回放,分析事故原因。</p>
<p>那么由此可见,采集的重点,其一在于真实性,其二在于时效性。这有点像是新闻了。保障真实性,就是数据不能被人为修正,传感器测量或计算的值应该原封不动地被传回;保障时效性,就是传感器刚一产生数据,就要被马上截取,并传回总部,期间时差不能超过5秒。所以,在设计采集程序的时候,第一要务是找到哪一个数据表、数据文件、数据包是"原生态"的,第二就是如何最小的减小开销,极大程度的减少时间消耗。功力就在两个词:观察、高效。</p>
<p>遇到没有见过的仪器,首先就是要分析该仪器是如何处理数据的,最好能拿到它配套的计算软件,检查每一个有可能"藏污纳垢"的位置,快速定位应该取哪里的数据。然后就是考虑算法,如果是文件,如何能最快定位到新数据产生的位置,截取需要的值;如果是数据表,如何能优化SQL查询语句,如避免使用order by等费时的命令。</p>
<p>以上基本是我第一年努力的目标。毕竟现场条件艰苦,不宜久留,快速找到自己需要的东西是最基本的能力。</p>
<p>这个层面仍然属于业务范畴,真正落实到Code,就不得不未雨绸缪了。你想,如果遇到一个你完全不知道结构的二进制文件,让你快速解析出所需的数据,需要多长时间?如果遇到你不熟悉的数据库,让你从中获取数据,你又需要多长时间?</p>
<p>这就需要提前积累,如必须设计一个公共的类,所有对于数据库的增删改查都应该封装成一个统一的接口,无论你面对的是SQL Server、Access、Foxpro、MySQL、Firebird还是SQLite,都执行相同的方法,那么取数据库特定表的数据,不就变得易如反掌。文件也是一样,文件的组织结构无非以下两类:</p>
<ol>
<li>一个文件一条数据<ul>
<li>Key/Value形式</li>
<li>结构体组织</li>
</ul>
</li>
<li>一个文件全部数据<ul>
<li>Table形式,有表头,然后一行一行数据</li>
<li>结构体组织</li>
</ul>
</li>
</ol>
<p>结构体组织多为二进制,Key/Value和Table形式多为明文文本。前者解析的重点是结构体,后者解析的重点是表头。其余的操作是否也可以封装为公共类?这样我拿到结构体或表头,便能够立刻解析出最新数据。</p>
<p>如果是较先进的仪器,符合WITS标准,并具备WITS发送能力,那么是否也应该准备好网络接收的类,无论是TCP Server还是Client,UDP,串口还是工业级别的OPC、DataSocket,我仍旧可以调用同样的方法。这样封装之后,我随时可以配置自己的接收端,接收到需要的数据。接收到了数据,是WITS格式的,还需要解析,这个操作也是需要封装的。</p>
<p>好了,需要储备的技术还真不少,数据库、文件、网络、串口、各种协议。这些都是公共基础子模块,是必须不断优化的。这些代码的优劣是采集程序质量的决定因素。</p>
<p>这就是我第二年的目标,准确的说,其实没有做的很好,期间也后悔过多次在大学没有夯实基础。没有几手硬功夫。</p>
<p>其实到此为止,核心的东西我们都设计地差不多了,最后也是最难设计的,便是交互界面。还好在能源行业,对于用户体验并不是互联网那套思路,井场的工人们,也没有时间无聊到观察界面是否优雅。界面的目的就是最快最直接的呈现软件具备的功能。让现场人员,可以按最少的按钮,输入最少的信息,以最快的速度完成一次操作。(互联网正好相反,设计人员更希望用户多花点时间在使用软件上,最好流连忘返,忘了吃饭)</p>
<p>第三年我基本在参考国外程序的类似程序,我发现国外的软件最为突出的特点就是灵活。他们的代码里一定没有任何写死的硬编码,每一个可能改变的地方,都会留出配置接口。但这样的缺陷也是明显的,配置界面会非常的复杂,然后后台数据库设计的非常的复杂,所有表、字段都是灵活的,都有元数据字典来管理。这就是老外的舍取:</p>
<p>他们选择了<strong>七十二变</strong>,放弃了<strong>傻瓜易用</strong>。他们的软件定位在给专业的人用,无形中也提高了他们软件的品味。</p>
<p>品味,是一个很玄妙的词,乔布斯有他的品味,苹果才如此优雅,你根本不需要学。但盖茨难道没有他的品味么?Windows难用的恰好合适,刚好让你能学会,还颇有成就感。再看看Linus呢?他的品味独具特色,Linux超级难学,人家压根就没准备给小白用,那是黑客与天才的系统,他们需要工具,而非玩具。</p>
<p>回到采集,我需要做的事情,也就是找准软件的定位,然后恰如其分的给出软件应有的长相。这里面的主角依旧是配置,是不是也做到了每一个细节都能被配置?要知道井场除了综合录井仪,还有LWD/MWD,钻参仪等等,难道每一类仪器都需要重写一套采集程序么?如何拯救他们?是不是该考虑一下WITS统一的标准带来的好处呢?</p>
<p>好的软件,是一个顺畅的数据流,采集软件,更像是诗经的开篇:</p>
<blockquote>
<p>参差荇菜,左右采之。</p>
</blockquote>
<p>WITS标准就像我们的箩筐,荇菜便是数据,软件就是这条美丽的河。</p>
<p><- 全文完 -></p>
]]>
</content>
</entry><entry>
<title type="html"><![CDATA[苦闷时光]]></title>
<link href="talk/distressed"/>
<published>2013-10-13T00:00:00.000Z</published>
<updated>2013-10-13T00:00:00.000Z</updated>
<id>talk/distressed</id>
<content type="html" xml:base="" xml:lang="en">
<![CDATA[ <p>本来想写一篇牢骚文,抱怨爱情的伤痛,处境的尴尬,工作的不力。</p>
<p>但最终还是删掉了那些废话,我想写一篇总结。</p>
<blockquote>
<p>每个人的命运都是悲剧的。</p>
</blockquote>
<p>我想,这就是我一直以来思考的生命的意义。</p>
<h2 id="说不出的话">说不出的话</h2><p>很难想象,我居然也会落得如此田地:有话说不出口。</p>
<p>难言之隐,竟然生生的发生在了自己的身上,我仍有点不敢相信。曾经的直抒胸臆、酣畅淋漓,现在的无话可说、无人可诉。我似乎触碰到了自己的局限性。好似长久以来都在潜水,没有一个机会,浮上来喘口气。</p>
<p>这么描述,好像我有什么隐疾一样。虽然明天就要体检,但至少目前还没有身体上的伤痛,上述都只是在说精神。那算是一种压力?一种迷茫?一种无所适从?</p>
<p>说不出的话,写都不会写,憋着,用内功消化。</p>
<h2 id="迷路的尴尬">迷路的尴尬</h2><p>曾经一切都很明确,我至少能看到命运的手。可,现在我瞎了。</p>
<p>上周一个人的深夜,忽然觉得自己在这个世界上本来也是有什么使命的,要不为什么不关心生活,不关心美食,不关心华服,甚至不关心朋友和亲人。我保留着人性温存的最小集合,仅此而已,人际让我觉得疲惫,我是社交冷淡者。</p>
<p>但那夜细细想了想,忽然自嘲,我有个屁的使命。小时候以为自己是上帝,并深信不疑,现在甚至不敢自诩程序员。只能说,我略懂计算机。</p>
<p>莞尔一笑,我还有那么自负的曾经。</p>
<p>一辈子,如果仅仅用来"生活",或是"享受",对于我来说,是无法忍受的。可是我说不清自己到底要干什么事。冥冥之中,总觉得有些事舍我其谁,也许人类历史某个犄角旮旯里,躺着我这样一个救世主。</p>
<p>救世主应该具备先知的功能吧?可我迷路了,是否反证我并非救世主?</p>
<p>我有什么特质是别的没有的?找不到?甘于如此平庸?</p>
<h2 id="工作的失意">工作的失意</h2><p>有个同事,是和我一起进公司的,打我认识他起,他就在捣鼓一个功能:实时曲线与仪表盘的绘制。而他也只研究一种技术:Flex。说实话,那个功能市面上有无数实现,而Flex随着HTML5的诞生也逐渐走向没落。所以我向来是很瞧不起他的。</p>
<p>两年多过去了,他的领导换了三四波,他干的事却一直没有变。仍然是曲线、仪表盘。期间上面的领导曾经做出了很多决策,如购买国外成熟的绘图插件等。他都没吭声过。决策们躺在无人赏光的文档库里,他的曲线和仪表盘却越来越象样。那东西本来就是展示出来给人看的,容易出彩。今天突然被领导发现了,叹为观止。用当时在场另一位同事的话说,和国外Landmark的Insite做的毫无二致。</p>
<p>再说一个同事,在本行业里摸爬滚打也有几年了,比我晚一年进的公司,当时作为行业专家引进的。他来了之后并未给我们项目带来多少新鲜的血液,以前做的东西也保留的小心翼翼。我怀疑他是否是名副其实,属于养老派。</p>
<p>可是这周项目组引入了一套成熟的WCF+WPF的.Net项目,让大家熟悉熟悉,为之后的对接做好准备。我们组以C++与Java见长,都不太会C#,所以大家也都是云里雾里看热闹,偷摸猛补C#。他突然说:我模仿这个架构,搭了一个Demo,大家来看看。边说着还嘿嘿笑着,回头对我说:这还挺好玩的。</p>
<p>这两位同事的事情,其实不值一提,互联网公司估计有太多这样事在发生。而对于我却是有十足的触动,因为都是我能做到的,但我没有去做的。我既耐不住性子,专心致志;也爱挑Easy模式,自我陶醉。而他俩,只不过靠了坚持与挑战。</p>
<p>Hard模式不是人人都能通关的,但通关的皆不俗,得到的快乐也不同。
一本书能够读完,而且反复读好多遍的,也很少,能做到也不简单了。</p>
<p>PS: 第一位同事在捣鼓曲线和仪表盘的时候,我把《C++ Primer》的前三章看了三遍。</p>
<p>第二位同事在钻研代码,理出头绪的时候,我不耐烦的看着《C#图解教程》,顺带做点核对数据库表字段的工作。至今,这本书也没看完。</p>
<h2 id="说点正事">说点正事</h2><p>无论如何,屋子要打扫,过期的食物要清理,衣服要洗,床单要在规定日期换掉。否则,只会更加苦闷。我不是做保姆的材料,但,不得不硬着头皮。</p>
<p>我还是相信自己有某种特质是与生俱来天赋异禀的。只不过我还没有发现,我这样等到70岁,也许也只是发现身边有一个69岁的老头样样比我强。我一天到晚读各种资讯,关注程序员的方方面面,也仅仅发现自己比较会挖坑而已。乱花渐欲迷人眼,不予置评。</p>
<p>我想,我应该不是没有发现,而是贪心更好的,明明使命是做一个举世无双的马桶,非要想着可能是做大陆首富。减法,会不会更有效果?</p>
<p>工作上还是不要那么短视吧,努力干实事,不用担心没人在意。只用担心,别人在意时,能否拿出值得别人在意的东西。</p>
<p><em>That's all, thank you.</em></p>
]]>
</content>
</entry><entry>
<title type="html"><![CDATA[噩梦]]></title>
<link href="talk/nightmare"/>
<published>2013-07-17T00:00:00.000Z</published>
<updated>2013-07-17T00:00:00.000Z</updated>
<id>talk/nightmare</id>
<content type="html" xml:base="" xml:lang="en">
<![CDATA[ <p>今天中午睡的很沉,做了一个很长的噩梦。起来之后,浑浑噩噩,不知所以,思绪繁杂,喜忧参半。</p>
<!-- more -->
<p>从上周六到昨天,一直奔波在大西北广袤的土地上。看了许多美景,也发生了许多事情。其实我是带着很多不情愿出发的,我就想回北京,不想在这里多呆了。可是师傅强烈的意志把我说服,带着些无奈,毫无准备的上路。</p>
<p>其实这半年来的工作让我很失落,重构过多次的采集器,也陷入鸡肋的境地,那些代码曾经是那么的有活力,但我深知,这个软件彻底死了,我的努力还是多余的。我反反复复大规模重构了有两遍多,第三遍还在继续,可是我真的不想再这样认真的继续了,想过很多次,要不草草收尾吧,再去做新项目,再去慢慢吸取教训。但我心里又有点不舍,没有人看到这里面的心血,正如没有人觉得这东西有什么价值一样。</p>
<p>这次出差快一个月了,钱花的差不多,人也快得罪的差不多,我一直想卖力的干点实事,实在不行,我每天都去上井?可是我真的不愿意浪费那时间,这算不算眼高手低呢?实际上,时间还是被浪费了,那些浅尝辄止的尝试完全没有一点意义。跟着IceSoul学了挺多皮毛,有过很多次兴奋,了解了很多不曾接触的领域。明白了自己的浅薄和渺小。无论是做人做事,还是专业与性格,都与别人有太多的差距。还记得去年写的<a href="./end-of-2012">年终总结</a>么。也许那就是我的硬伤吧,想做的完美,却又缺乏见识与阅历。最终就是做了许多无用功。</p>
<p>IceSoul说的很对,我心太浮躁了。每个问题都很难深究而后形成自己的看法,往往都是人云亦云,或是故弄玄虚。枉我还是正经的计算机专业出身,很多时候都表现得太不专业。技术上又容易固步自封,缺乏深入的思考。再就是喜新厌旧,容易三天打鱼两天晒网,各种秒射。要不是工作的原因,我想我很难能在C++上有什么发展,一定也是玩玩就扔掉了。他说我像个小孩子一样,是一种幼稚,这也许不无道理。</p>
<p>可能是漏了底,其实我来这边,是很想要出点力帮点忙的,可是渐渐发现IceSoul基本上都自己搞定了,反倒是我从他那里学到了挺多,他估计对我也不太信任了,知道我能干什么不能干什么。走的太近就会有这样的危机,这就算是代价了。我忙乎来忙乎去,还不如把自己的事情干好,回北京老老实实的生活。</p>
<p>可是回去就能老实生活么,公司就要搬到昌平,难道让我去租房?我真的要想办法调换部门了么?还是直接投投简历,换份工作?更头疼的是要怎么准备结婚事宜呢?我现在有什么基础,又有什么资本呢。想到这些,就很难无忧无虑。加上父母一直催促出国或是考研,更是火上浇油,压力山大。</p>
<p>小王说得对,有能力的人早就离开了。师傅说得对,在这里基本学不到什么东西,不如小公司,不如油田应用技术部。IceSoul最早也说得对,现场的工作不难做,要看谁做。</p>
<p>以上三位都是我的师父,从小王那里学习与人打交道的能力,处世避免显得过于生硬。从师傅那里学着如何做专业软件,避免走太多弯路。从IceSoul那里学如何处理工作,如何具备清晰的思路,敏锐的了解每一个人,做到知人善任。</p>
<p>这三位师父在软件开发里,对应的就是如何做需求、如何做开发和如何做管理。每一个步骤都需要具备他们身上的特质,才可以做的完满。可这三样,一样也不适合我。</p>
<p>当我不知道如何与人打交道,如何游刃有余的混迹社会的时候,我就安慰自己,做好开发就好了。当我走过一个又一个弯路,做得东西得不到别人认可的时候,我就安慰自己,可能我具备的是综合素质,对整体项目能够进行把控。当我看到IceSoul是怎么处理现场的各种情况,各种人的时候,我只好安慰自己,年纪还小,唯有多努力。</p>
<p>这一个月虽然在工作上做得并不多,但更加看清了自己,无论是感情、还是事业上,都算一个警醒,或许以后,知道该如何为人处世,如何形成自己的风格了。</p>
<p>我想,总会有自己适合的不是?</p>
]]>
</content>
</entry><entry>
<title type="html"><![CDATA[终是分离]]></title>
<link href="talk/last-sentence"/>
<published>2013-07-09T00:00:00.000Z</published>
<updated>2013-07-09T00:00:00.000Z</updated>
<id>talk/last-sentence</id>
<content type="html" xml:base="" xml:lang="en">
<![CDATA[ <p>她反复说我要挂了的时候,我的脑海里是一幅幅画面。夜里走在广平大街上的、满头冒汗去机场的、心有忐忐地前往宝鸡的、一起骑车在杭州街头的。那些画面感觉黏在心头、混在血液里,生拉硬拽了一番。很难扯动。</p>
<p>好不容易扯开了一层皮,就有点像冷水过了一遍久未冲洗的褶皱一样,空空如也的缝隙里冷空气肆意流窜着。空着冷,也是抽着疼。就像通常脱了皮,起开一个口子,就想忍痛整个扯掉。让新生的皮慢慢与空气交融,慢慢生长。</p>
<p>来了三封短信。语气开始变得客气,里面似乎又带着些嘲讽,又有着点委屈和无奈。很夜了,最近都不知道什么是夜。是的,没有她我也会熬夜,我也会照样浪费时间,我也会一次一次的去西北。好像没一点区别。</p>
<p>说无悔,但其实总是带着些将就的。有些事情发生,我是很敏锐的,但我始终让自己保持迟钝,我记得<离婚进行时>里讲的那句,感情是讲不了道理的。于是我就退,能退就退,放弃自己的立场、习惯、甚至是尊严。做了很多我以前根本做不到的事情。我觉得时间是最强的武器,只要挨上个两三年,互相熟络了,离不开了,就磨平了互相的棱角,抱在一起不会痛了。可是,终究敌不过无缘。</p>
<p>这次栽的不轻,吃了很多亏,也真的明白了很多。债永远还不轻,太沉重了,这个尴尬的年纪,又是这样的事情。真的不想再爬起来了。小心使得万年船,人的事情,来不得一刻的放松。可是,我们的初衷是什么?不就是放松和快乐么。随心所欲不逾矩,孔子都需古稀才能做到,二十出头的年纪,又如何能驾驭得了。</p>
<p>感觉突然回到了几年前大学的日子,那种怎么努力也得不到自己想要的窘境。最后总会感慨,还是不够努力,总有那么些情况,让你的努力还不够。这是人性的束缚,也是年轻的代价。终是命运的折磨。</p>
<p>还是孤独点好,再多痛苦折磨只是自己承受,不干别人的事情。可感情处理的不好,也许是两个人终身的代价。再次说明了不能没有底线,任何情况都是这样,触碰了底线不能手软,否则付出的将是几倍于此的代价。</p>
<p>我已经在这个世界上存在了8535天,至此,没有一件真正值得骄傲的事情值得说道。太多的遗憾已经淹没了我的神经。如果再来一个8535天,会不会有不同?不知道,但能确定的是,那时已经无法回头。</p>
<p>只差40天而已。数字让人心痛。但无法回头了,彼此都无法接受了。</p>
<p>18岁之后,以为想怎么样就怎么样,不假思索,随性挥斥着时间与决定。连续碰壁,头破血流,收获的,竟然只是16、7岁年华在某本书上看到的一句话而已。这些话还会穿插在生命中出现,以前把它们当故事听了,现在才知道,原来自己也会有故事,终有一天,也会成为故事的主人公。他们承受的痛苦与折磨,自己只会感受的更真切。</p>
<p>此刻的靖边小县,窗外雨水滴答滴答的下,深夜里听得格外不是滋味。</p>
<p>17岁我听过这样的雨、20岁也听过,今年23岁,又在听这样的雨。</p>
<p>写到这里,她来了一个电话,口气缓和了许多。我竟又有些心软了,能不能就这样算了,过去吧。这让我想起,中午师傅说,在这公司把人待废了,如果我在小公司,水平肯定不会是现在这样子。我何尝不想跳巢,可是我想着,要不再待待看吧。又让我想起,老爸晚上给我电话,问对未来有没有什么考虑,研究生还有没有想法。我不是没想法,可是得过且过吧。毕竟我又不是活不下去了。</p>
<p>就像沸水青蛙,如果不是突然把它烫着,它完全不知道会如何死去。</p>
<p>感情、工作、和生活,都是需要决定的。否则,就只好等死吧。</p>
]]>
</content>
</entry><entry>
<title type="html"><![CDATA[花一些时间思考]]></title>
<link href="talk/take-a-moment"/>
<published>2013-07-05T00:00:00.000Z</published>
<updated>2013-07-05T00:00:00.000Z</updated>
<id>talk/take-a-moment</id>
<content type="html" xml:base="" xml:lang="en">
<![CDATA[ <p>今天小王赶到靖边,他是个好事之人,便邀这边的同事一起去搓一顿。我恰好也在,便一起同往。</p>
<p>酒桌,向来是我最厌恶的地方之一。烟雾缭绕,红着脸吹牛,顿感生命的无聊。我是个怪性子,到了这种气氛下,便警觉的很,不容丝毫轻松,拘束地不愿说一句话。我坚持滴酒不沾,所以容易冷场,明知道不太好,但也奈何不了自己。解决方法就是不去这样的场合,既然去了,就得承受尴尬。</p>
<p>酒足饭饱之后,重新坐在电脑前。突然思考了很多。也许是回忆了一天内和女友的对话,也许是瞥见了本科同学的硕士生证书,也许是看到了小王,想起了去年的自己。反正,褪去了轻浮的兴奋,放松的傻笑。一个人呆坐着,想花一些时间思考。</p>
<p>好久都没有更新这个博客了。这个既最下功夫,又花钱买了域名的博客,反而没有新浪博客更新的勤快。很忙吗?这是她经常问的一句话。这倒是一个最自慰的借口。</p>
<p>看过我以前博客的人,都能感觉到那种硬撑着的正能量,或是自我哀怨的小调子。我还经常自诩文人,其实是给自己贴金,给文人丢人。唉,越来越没自信了。</p>
<p>我想到了过去,想到了未来,昨天中午迷迷糊糊做的那个难受的梦,还横桓在我心坎里。这也许都是酒桌这样一盆冷水把我激醒的。戳中了软肋,才会另寻生路;言中了痛处,才会奋起直追。我不爱去同学聚会,不爱参加各类活动,就是怕自己的弱点暴漏在众人下,被无形的气氛逼得抱头鼠窜。</p>
<p>所以我容易沉迷在自己的世界里,玩一些小技术,学一些小知识。对那些未知领域尤其着迷,因为这里我即使受挫,只需要一点耐心,花些时间,就能获得莫大的成就感。这种感觉是容易上瘾的,有时以为找回了自我,其实是迷失而已。</p>
<p>我相信,人与人的差距并不是因为社会地位、家庭背景、成长历程等等我们习以为常的原因,而是思维观念。也许另一个世界里的我,就不会有这许多思考,依旧安于做一个小屌丝,依赖着可怜的成就感为生。也许又一个世界里的我,会彻底转变观念,直面自己的弱点,在各类场合表现出成熟的风范,能够不那么自私,能够让身边的人舒服。</p>
<p>可是这个世界的我,依旧难以摆脱根深蒂固的观念。这便是一种科学的宿命。少有人可以躲得开。</p>
<p>很多人说,你为什么就不表现出“好”的那些行为?</p>
<p>因为你懒,因为你自私,因为你娇生惯养,因为你意志薄弱。</p>
<p>我听着这许多话,继续自怨自艾着,想做点什么摆脱这样声音的围剿,想成为那个“好”的我。我对不起身边的人,我活着的方式,以为会给你们带来快乐,实际却是让你们莫名的痛苦。我不断的给这些人道歉,到最后也不好意思道歉了。也许我应该做的,只是躲入自己的森林,老死不相往来。</p>
<p>我经常那么想,这样想下去,不知道还会有怎样的心态。</p>
<p>而,正是这些脑子里装的,最底层的东西,观念和心态,决定了你是怎样的人。</p>
<p>如,我这样的,永远只能写出自怨自艾的文字,恬不知耻的拌着可怜。</p>
<p>这是精神上的乞丐,没有自己的东西,还会被人认为是自私的家伙。</p>
<p>哎,自己的事情,写在自己的博客里,谁也别看。</p>
]]>
</content>
</entry><entry>
<title type="html"><![CDATA[有多少虚伪的了解]]></title>
<link href="talk/shesaid"/>
<published>2013-06-30T00:00:00.000Z</published>
<updated>2013-06-30T00:00:00.000Z</updated>
<id>talk/shesaid</id>
<content type="html" xml:base="" xml:lang="en">
<![CDATA[ <p>有多少虚伪的了解,能让你牵肠挂肚。</p>
<p>有多少虚伪的了解,能让你无法释怀。</p>
<p>他虚伪地认同了他的虚伪,你失落地消化着你的失落。</p>
<p>有多少虚伪的了解,能让你光阴虚度。</p>
<p>有多少虚伪的了解,能让你自我满足。</p>
<p>他诚恳的保持了沉默,你独在深夜局促。</p>
<p>有多少虚伪的了解,能让你脱口而出。</p>
<p>有多少虚伪的了解,能让你不去琢磨。</p>
<p>他说那都是兴之所至,你说那不过是形式。</p>
<p>有多少虚伪的了解,能让你形同陌路。</p>
<p>有多少虚伪的了解,能让你抱头痛哭。</p>
<p>他不解为何统统都有恶意的标签,你说无知本身便是最大的恶念。</p>
<p>有多少虚伪的了解,现实在这边,爱在那边。</p>
<p>心意是否离别?爱是否无解?</p>
]]>
</content>
</entry><entry>
<title type="html"><![CDATA[也说青瓦阁楼]]></title>
<link href="talk/qwgl"/>
<published>2013-05-10T00:00:00.000Z</published>
<updated>2013-05-10T00:00:00.000Z</updated>
<id>talk/qwgl</id>
<content type="html" xml:base="" xml:lang="en">
<![CDATA[ <p>请先看看<a href="http://xn--xwq36n0ppci8b.cn/content/loft">这里</a>。</p>
<p>青瓦阁楼是一个意象,那里的瓦不是青的,说阁楼也有些小气,那是完整的一层楼。我最迷恋的顶楼。</p>
<p>但青瓦阁楼也是一间房,是主人起的名字,飘逸秀气,Jian很喜欢,那真是一间阁楼,很小,但却有一张床,一个浴缸,一个天窗。都是极尽惬意的事物,稍稍想象下,心里都会痒。可惜,我们虽然订了青瓦阁楼,但却以免费升级的名义被请往一层的主人房。未免遗憾。</p>
<p>住的房里,有天来了只老鼠,趁着人们酣睡的深夜,偷吃了一个大苹果。它仅咬下了一小块,但肉啃的很干净,留下些细碎的皮屑。以留作清早与我们分享。“这么一说,其实真是件恶心的事情。”(大笑)</p>
<p>不知道那只小老鼠,偷吃时心情该有何等愉快。里屋的那位喵星人应该并没有打扰它的兴致。</p>
<p>关于房间结构与村落构造,Jian说的清楚明白,那也是那篇文章最动人的地方。多看了几遍,心里便有些微醺了。不得不叹服Jian的文字造诣。</p>
<p>可心刚刚化开,Jian就开始提到了人。</p>
<p>世界上的人,大体上分为两种人格。伟人和英雄——伟人是庸人的最高体现,而英雄,是必有一面极其超凡,始终不安太平的。而这个世界毕竟庸人众多,所以伟人往往取得最后的“胜利”,所谓胜者为王,历史上记载着一大串的伟人。而,这些人,真正的英雄都是看不上眼的。不谈化名的主人当初的决绝,我宁可理解成他心里英雄的种子发了芽,世俗的胜利,在他的心里,被古旧平淡的瓶瓶罐罐挤的没了位置。Jian和我也有这样的种子,而她想将之送给化名,而我偷偷藏到了阁楼。我俩都被莫名的暗流推到了通往伟人的路上,这条路像村里入夜后的羊肠小道,远处泛着幽冷的火光,看不到头。还记得那晚Jian面对这条路时紧张而急促的呼吸。</p>
<p>其实,在她身上,我能看到拜伦的影子。那是人类文化的最强音,反对权威,崇尚自由,绝对的个人自由。那是英雄之路的终极。</p>
<p>还说青瓦阁楼。</p>
<p>当地人多以经商为主,惯于敛财,这样的习惯集中表现在了天井上。整座楼房仅有天井一处采光,阳光满满的洒在天井里,像黄金;待到冬天雪季,白雪满满的落在天井里,像白银。这样的想象,是对钱财的意淫,充满着俗气。我倒是想象着雨天的天井,雨水滴落在天井里,听雨能听的无比真切,伸伸手就能感受雨水的清凉,而不至于被淋湿。真是恰到好处的设计,特别美。</p>
<p>但对天井仅限于想象,二进上三层的楼阁却是喜欢的真切。</p>
<p>那里,可以感受到四面八方的风,每扇窗都有不同的景致,或远山,或清池,绿绿葱葱,延绵天边。看得累了,就坐下,捡起几本古书,细细品读。那里,你的心可以十分的平静,可以安放得住,可以平躺。这时候,才能品鉴的出书中的古意,会心一笑,怡然自得。那里,你可以忘掉在世俗中的一切,唯有清风和明月。可以拉着你想拉着的手,呢喃,旖旎。那里,你的世界显得十分清晰分明,你能感受到自己的存在,你能确定,你是自己的王。</p>
<p>可是,阁楼若没有基石,岂不成了空中楼阁?底层的屋子,透着规矩,谨然的很,两侧对联,环抱着道义。对着厅堂,守着礼节,一切井然有序。静处在那里,甚至想象出清人的作揖,品茶,聊天,读书。“二字箴言惟勤惟俭,两条正路曰耕曰读”,Jian说,古人可选的道路无比明确。我脑海里却泛起功名利禄之独木桥上的悍然厮杀。</p>
<p>写到这里,就能看出此楼的隐喻。古人讲究内圣外王,固是一理。一楼接待来往宾客,处处是人情世故;阁楼作为独处之所,琴棋书画,是隐蔽的个人精神世界。要想保得住个人的小宇宙,既要做到<strong>世事练达</strong>,又要做到<strong>淡定通透</strong>。这都是修炼的功夫。</p>
<p>平静如镜,干净如水的青瓦阁楼,若是没有底下规规矩矩的支撑,恐怕只是镜花水月。</p>
<p>所以,青瓦阁楼是属于神的,底层的担当,高阁的隐逸,那早已不是凡人。</p>
<p>正如这里的主人,看似不流俗,极富个人魅力,可如果不是通晓人情,岂能在此村立足?干净的是山水,青石板掩盖了人与人之间卑劣的暗渠。</p>
<p>不如,你做青瓦,我做楼阁。成为各自的英雄,互补成神。</p>
]]>
</content>
</entry><entry>
<title type="html"><![CDATA[井场实时数据采集器开发日志]]></title>
<link href="talk/about-collector"/>
<published>2013-04-05T00:00:00.000Z</published>
<updated>2013-04-05T00:00:00.000Z</updated>
<id>talk/about-collector</id>
<content type="html" xml:base="" xml:lang="en">
<![CDATA[ <p>以前为了让DLL内部拥有更多的控制权,将采集间隔的控制放到了DLL中。但现在需要将实时数据显示出来,那么第一次调用DLL的时候,就无法立刻显示数据,而是需要等待一轮间隔时间。这就给用户造成一种很不灵敏的感觉。于是这次我将采<strong>集间隔的控制从新放回了DLL调用外部</strong>。</p>
<p>采集器的开发基本告一段落。这一次完全是速成式的开发节奏。虽然我很小心翼翼的力图让代码结构清晰,功能明确,小巧易改。但是最终,在我五一放假归来后,嗅到了代码的臭味。</p>
<p>是的,我的代码有了不好的味道。</p>
<p>起初,我的设想是,尽量开发可以复用的小模块,我开发完,别人也可以直接利用。而且力求一个模块只做好一件事,这是借鉴了UNIX思想的。可是我忽略了一个情况,我并没在Unix/Linux上开发项目,而是在windows。这就出现了很可笑的情况,我开发的小模块,看似灵活可拆分,实际呢,却没有人可以用。</p>
<p>问题首先暴露在界面上。人的一生有许多追悔莫及的事情,而这样的悔恨多来自于对坏习惯的熟视无睹,或是,每次都挑选简单熟悉的方式解决问题,即使明明知道那并非最好的解决方法。人总会向自己的惰性妥协。对于传统的C++程序员来说,MFC就是这样一个陋习。而我早知如此,却一直未能摆脱这段噩梦。</p>
<p>2011年我首次接触MFC,觉得还蛮新奇,毕竟除了Java Web以外,我并不知道该如何构建一个界面。不过我坦言,两年来,我虽然用MFC开发了好几个小程序,但仍然没有真正的学明白MFC。正是因为这样的原因,每当我发誓弃MFC而去的时候,总会有一个声音嘲笑自己:半途而废的东西,没真正明白一项技术,没有权利批驳它。</p>
<p>于是,我努力在<a href="http://www.codeproject.com/">codeproject</a>这样的网站上寻找开源项目来提升自己的见识和实力。一次又一次的优化自己手里的项目。毕设就不提了,完全是玩具项目。工作以来,接过师傅的VC6程序,就一直琢磨着改造。直到如今,简化到采集器这样简洁清晰,着实费了一阵功夫。但,两年以来,一直局限在MFC里无法自拔,逐渐就脱离了日新月异的技术浪潮。</p>
<p>但MFC真的无法解决很多问题:</p>
<ol>
<li>多文档太过重量级,除了大型的应用程序,不会用到。而在一个Web和移动应用盛行的今天,很难再有重头开发大型的桌面程序的机会了。基于对话框,我想是大多数人最经常的选择。而,即使是基于对话框,也需要循规蹈矩的生成一个千篇一律的框架结构,其中大部分东西都不会用到,MVC结构根本不清晰,大部分代码集中在V这层。结构很是冗余,而且生成代码过多导致修改起来十分费劲。</li>
<li>可用控件少的可怜,而且老化严重,比起同门师兄C#来说,既丑陋又贫困。VS2010里加了许多以MFC开头的特殊控件,想力挽狂澜,可惜用起来并不灵活,相关文档也很稀少。而且控件的绑定与之间的通信,都十分费劲。资源文件里一不小心就会有冲突。设计好的界面也很难有复用性,一般都是用打开的方式,复制rc文件。可是界面关联的逻辑和变量咋办?与已有界面元素冲突咋办?都能办,就是繁琐的很。往往复制来复制去,还不如重新拖拽一个。想做点界面美化的工作?别想了,费老劲还没个结果。</li>
<li>充斥着大量的个性方法,我承认,CString的很多方法都很好用,完胜std::string,但是很多底层的类都是用纯C++或纯C来写的。怎么结合呢?从效率角度思考,使用Unicode工程,好了,代码里各类W2A和A2W,仅字符串来讲,就会需要各种转换,弄熟悉了也觉得代码很乱。另外,MFC的容器真的很屎,完全无法与STL媲美。</li>
<li>跨平台是个大问题,不说Linux和Windows之间,就说Windows自己,在Win7下写出的程序,在XP或是win2003上完全走样。保守来说,不敢用太新的控件,否则总会出一些莫名其妙的问题。再说DLL,DLL很容易引起灾难的。稍微一个版本不一致,就会让整个应用程序不举。企图用DLL来让程序模块清晰,小巧玲珑,完全是个梦。而且MFC DLL真的很鸡肋,复用性如何考虑?纯C DLL要好很多,但是少了图形界面,很难实现界面组件化,随时可插拔。另外,移植性并不理想,VS2010编译的MFC程序,需要mfc的好几个dll,哦,你说为啥不编译成静态库?试试就知道,问题很多。</li>
<li>最让人难受的,还是MFC写的程序真的很容易发臭。我不知道如何描述这样的感觉,即使你在编写的时候,各种小心,力求清晰可修改。但真正需要你修改补充的时候,就寸步难行。不知道是咋回事。也不知道别人是否有这样的感觉。偶尔,你想着,这个功能我曾经写过,想抽出来,用到另一个工程中去,想着挺简单,不知不觉就会浪费好多时间。MFC的代码一点也不美,味道真的不好闻。</li>
</ol>
<p>以上五条,纯属个人吐槽,很多地方其实都是我自身的原因。但如果MFC是一个产品,我是一个用户,我就是不爱用,我想这是一个用户起码的权利。</p>
<p>我去年年底就发誓,配置小工具是我最后一个MFC作品,没想到今年又紧急开发了一个采集器。这绝对是最后一次了。</p>
<p>已经开始抽空学习QT了,QT的很多思维方式都很赞。虽然我还只是摸到了皮毛,但是已经嗅到了它的清香。</p>
<p>扯界面扯了这么远,其实界面只是一个因素。更可怕的是我误解了DLL。</p>
<p>采集器一共由五个DLL和一个EXE组成。EXE是主界面,用来呈现采集上来的数据。重要的功能全部分配到DLL身上来实现。五个DLL实现的分别是,连接服务器数据库,取得服务器数据库中的配置,采集仪器数据,处理仪器数据,将数据组织为WITS标准的UDP消息发送给服务器。取得配置DLL,主要替代了以前的配置小工具的功能,也完美的解决了XML、INI配置文件的繁琐。采集和处理DLL,主要继承了之前的DLL,改动不大,仅是简化。将打包DLL去掉,换成了发送的DLL,解决了共享的问题。</p>
<p>这样以来,程序结构看起来很清晰,每一个DLL干好自己的事情就行了。而且连接数据库和取得配置的DLL都是带界面的,属于具备MFC类的C Dll。我想着,这可以实现复用。还故意把接口弄成了读写文件形式,这样耦合度很低,即使没有DLL,EXE照样可以运转。</p>
]]>
</content>
</entry><entry>
<title type="html"><![CDATA[写在2012的尽头]]></title>
<link href="talk/end-of-2012"/>
<published>2012-12-31T00:00:00.000Z</published>
<updated>2012-12-31T00:00:00.000Z</updated>
<id>talk/end-of-2012</id>
<content type="html" xml:base="" xml:lang="en">
<![CDATA[ <p>年底总会写很多总结,学生时代为了给老师看,工作了是给领导看。什么时候才是给自己写的?以前总有这样的计划,直至今日,方才动笔。</p>
<h2 id="回忆">回忆</h2><p>1月份的时候,公司发了年终奖,还有一大堆福利,看到自己总算有了工资,心里难免会激动一场。而2011年的下半年,基本再为乔布斯而疯狂,于是,拉着Mr.Fox一起,走了一遭西单大悦城的Apple专卖店。经过一番劈天盖地的忽悠,我拎着一台iMac就回家了。那算是第一次与苹果亲密接触,趁着新鲜劲,赶紧买了一本Object-C基础教程。立志要能够写出自己的App,最后可以在商店上架。理想很丰满,现实很骨感。这本Object-C基础教程,除了第一章,之后都干净的很。原因是因为当时的工作任务,不怕不好意思,那时我第一次知道了用纯正的C++写类的感觉,而且还更进一步的写了一个基于观察者模式的框架。那种感觉实在爽到不行,再加上新来的组长是一个有20年C++编程经验的高手,于是乎我日日加班加点。苹果梦,不知不觉就淡忘了。</p>
<p>2月来的很快,那时我心有揣揣,领导突然安排我去西安出差。什么Object-C,什么观察者模式的消息队列,手还没有热乎,就要收拾行囊准备独自上路了。初到西安的时候极其不习惯,陌生的同事,完全不同的工作模式,我当时攒了一肚子怨气,于是搞砸了计划好的与北京同事的远程合作。那消息队列框架算是我来公司第一个像样的作品,却在襁褓之时就被告知放弃,这是如何也无法马上接受的。因此还差点和同事闹了矛盾。本月算是今年的第一次逆转,接收到两个教训:其一,工作要明确责任,做好自己的事情,不要老是盯着别人的活;其二,减少文字性聊天,如QQ,很容易产生理解性误会。</p>
<p>3月,人已在甘肃庆城县,遍眼的黄土还不算寂寞,荒野里住一宿也没有太意外。可是下旬近半个月没有和人类说一句话,的确有些难受。那段日子一个人在宾馆里,领导又没有切实的给我安排什么具体的任务,只好拿着一本Ruby入门开始学起了Ruby,当时,除了ios,最想学的就是ruby,没有很明确的目的,就是兴趣所致。当时还研究了好一会《番茄工作法》,但后来完全用不上,因为宾馆里除了睡就是吃,没有交流没有沟通,更不会有什么人会打断你。这里我漏掉了一环,从二月开始,我就想复习今年的考研了,对于一份这样的工作,我并没有找到做下去的意义,只是觉得读一读研究生可能会把一些事情想的更明白。于是二月还西安的时候,我就在当当网上买了很多考研复习的书籍,也很有计划的开始看高数和C语言了。三月上井,却没能带上这许多。这才彻底放开,去看Ruby的。</p>
<p>好不容易适应了孤独的日子,带我的师傅和以为年长的同事突然从现场赶回了庆阳。通知我一起去内蒙古的乌审旗,最后把我仍在了乌审旗的一个井场上,呆了四天的时间。井场上那带沙的饭和数的过来的几个冷菜,我都已经熟悉了。甚至连录井房的那几位技术员也聊得很开,但这样的日子毕竟过的荒诞,期间我多次催促项目组来接我下去,现在想想其实真没必要。后来项目组把我带回了乌审旗,我独自走在陌生的内蒙风情的大街上,心里只想着赶紧回家。回西安的大巴很颠簸,我中途拉了肚子,但由于车在高速上跑,没有办法停,只好忍了一路,只记得下车时的无比狼狈。</p>
<p>4月已经在西安,当时有点旅游控,就想着走天涯,去远方,独自远行之类的。于是总算在西安市内好好转了转,陕西历史博物馆给了我很深的印象。从小对有历史的东西就有莫名的痴迷,在不算大的博物馆里,从上午9点一直待到了12点多,出来时才感觉到了饿感,才在门口吃了一碗牛肉面。之后就去了大雁塔、慈恩寺,沉浸在自己营造的诗情画意中,倒也心满意足。这个月对于考研的坚持就没有那么的强烈了,对于网上各种新潮的技术都有了兴趣,看看这瞧瞧那,没个定性。但一个同事启发了我对于octopress的认识,那算是我第一次动手倒腾极客的事,这才诞生了这么一个简陋的个人Blog,不管怎么说,都很开心,中间由于公司内网的障碍,也遇到挺多的问题,但都一一解决掉了。这个月,让我在技术上的眼界更加的开阔了,风格上也更加的大胆激进了些,不管懂不懂,动手试试再说。下旬,西安的领导让我改进师傅的程序,我也恰有此意,当时我只是想尝试用自己的方式来重新实现师傅的程序(其中很大的原因是我不愿意在用VC6那样碍眼的编辑器了。。。),但我设想的有点太大,几乎把我见过的技术全都想用一遍,于是这个程序就演变成了一个具备socket传输、打包服务、全套的XML配置等的小框架,基本呈现一个C/S模式。但由于技术不精,交流不畅,与另一个负责远传的同事发生了一些激烈的争吵,这个小框架虽然被我自豪的上传了github,但最终还是不了了之了。可是,这个小框架算是我第一次肆无忌惮的独立设计,期间对很多的小工具与C++编程的思路都有了很好的沉淀,为下半年设计井场数据采集中间件流水线框架打下了坚实的基础。4月算是一个技术提升月。</p>
<p>5月的开头,为了满足自己的旅游梦,与师傅和另外一个同事一起,走了一趟洛阳和嵩山少林寺。地方俗得很,但玩的很舒服,至少爬山算是爬爽了。第一次对山间清新的空气有了无比的迷恋,深深的厌恶都市里充斥尾气的环境。旅游的确能让人明白许多事,能让人放开很多事,但也不知不觉花了许多钱。有失有得吧,但总算有些缓解了我对于旅游那种极度浪漫主义的渴望。就那么回事吧,山清水美又能怎样,关键是你与谁携手。回来后,立刻就收到了上井通知,这一去就是半年的旅程。</p>
<p>5、6月我遇见了很多人,要比我以前一两年遇到的人都多,也遇到了许多事,让我这娇生惯养的小皇帝体验了一把劳动人民的艰辛。这里不得不提一下遇到的极品同事王小贱,这位纯正的90后是第一次上井,但却有着丰富的江湖经验。早年就和我师傅一起在阳台上抽过烟,所以这次并没有太多生涩的感觉。小贱对于生活的理解及其简单,吃喝玩乐一样也不能少,年纪轻轻,对于嫖赌已经见怪不怪。从他身上,我顿时觉得自己有点白活,十几年的学校生涯,让我并不知道外面的世界原来有这样多的花样,遇到他简单至极的生活理念,我一肚子的思想道理也无处倾泻。但小贱这样玩得转的人,是不会屈膝做一些具体事情的,师傅也没理由动手,于是在井上,我满头大汗跑东跑西,又是抬箱子又是埋网线,上至房顶,下至床下,左手U盘,右手签单,嘴里还要给技术员们培训。只记得那段日子很痛苦,却又没法诉苦,只能小心翼翼的配合。而他们却照常嘲笑我在车上重重的鼾声,急急忙忙的小便。这些只是小事,但小贱对于报销上玩的手段却让初涉社会的我猝不及防。不管怎么说,这两个月里,我知道了太多社会上的事情,我眼见着认识三天的人称兄道弟酒醒酒醉,我也明白了一根烟、一杯酒竟能轻轻松松破除人与人之间的隔阂。小贱如果不是对于小钱小利太过猴急,我甚至看不清他的真实面孔。这让我知道,出门靠朋友,但更要靠自己。</p>
<p>6、7月,上井已经成了家常便饭,在外漂泊的日子算是倦了,认识的新同事越来越多。老江湖去玩女人,屌丝儿只好dota。那一段日子除了修改程序时的充实感外,灯红酒绿、觥筹交错与11平台上的开黑都让我事后倍感空虚。所谓闲,就是在宾馆里一起抱怨工作一起想家;所谓忙,无非就是陪领导喝酒侃大山,给领导交报告,满足领导天马行空的需求。但也不能算是完全荒废,起码我学会了在外如何与别人相处,如何游离在亲密与疏远的中间地带。如何与那些社会上的老油条们谨慎相处。如何凝聚自己所在的团队等。但核心还是想家,厌倦了东飘西荡的感觉。</p>
<p>8月份基本已经确定了回京的事宜,月初从北京休假归来,在西安感受到了强烈的寂寞感,还好一位帅哥同事友情援助让我安稳度过一晚。第二天坐上到延安的高铁,再坐大巴到了志丹与师傅们会和,但很快师傅就已经离去。独留我一个人带队实施。那段日子还是挺有成就感的,因为完全由我来安排一切,当时我积极的改版新程序,同时也积极的辗转陕北到处上井。从志丹到吴起,从吴起到安塞,又从安塞抵达靖边,一路上结交了许多当地项目组的人。曾经青涩稚嫩的我也能装模作样的游刃有余于合作与交流中。由于队员与司机的疲惫,我只好一个人上路,再次乘坐大巴去了定边的冯地坑与另一个小队汇合,在那里才认识了<a href="http://www.cnxp.org">冰魂网络</a>的站长IceSoul,这家伙年过三十还打着光棍,却还自娱自乐的玩弄着各种小技术,是个标准的极客+屌丝。从他那里,很多对于windows系统方面一知半解的知识都得到了验证和解释。他早年编写的许多小工具都让我大开眼界,也算是我在现实中第一个遇到的偏骇客的家伙了。那段日子有趣极了,我们每到一个旅馆,都将旅馆的路由器进行整改,以保证我们房间能够有足够的网速来dota。但并非每一次都能得逞,最后在庆阳的时候,我们摸到了人家的视频监控系统,却没能破解了其密码,确是遗憾。在他的催促下,我将井场自动采集软件做了最后的整改,配合他编写的配置小工具,倒是相得益彰。</p>
<p>8月绝对是神奇的一个月,除了上述的辗转陕北与到处捣蛋,竟还莫名其妙的遇到了我生命里的冤家,刚认识她的那几天,每天我都像打了鸡血一样,抱着心爱的iPad和她胡天海地的聊着,用我妈的话来说,就是把她和我爸一辈子的话都在那几天内说完了。现在想起来,会觉得滑稽,捧着一个iPad不玩游戏不看电影不看电子书,只用iMessage和一个不曾谋面的女孩聊天。实在奇葩的很。不知道哪里来的自信,和她聊完的第二天,我就有强烈的把握可以搞定她(可是这样的感觉并未持续很久)。正是因为这隐隐约约的暧昧情迷,才会出现上文所述那种需要别人催促才去编程的尴尬状况。写到这里突然不愿意多回忆关于她的点滴,因为每一天都记得十分清晰,从8月19日的第一封短信开始,直到如今。这并不需要总结,更不需要——回忆。就像阿里巴巴得到了四十大盗的宝贝,尽管情不自禁的让大门露出了一点缝隙,但立刻就会掩上,生怕别人知晓了去。</p>
<p>9月的第一天,我已经在北京上班了。从微博的数量就能看出来那阵子我的兴奋,爱情工作友情,重新回到了我的生命里,让寂寥的荒野,硬是长出了青苗。但爱情里有甜蜜势必就有苦涩,白璧微瑕更像是真实,娇艳的花朵总需要有破壳的过程,痛过方知不易,失去才知珍惜。月底更显忙乱,略去流水,算是留白吧。</p>
<p>10月初,去了一次舟山,参加表哥的婚礼。乱糟糟的幸福充斥着难闻的气味,我并未留下太多好的记忆,倒是后来去老家山上待的那几夜,映着月光在屋顶通电话的静谧让我难忘。青山绿水,流转着浓郁的思念。粗茶淡饭,消磨着转瞬的悲欢。梦里总会出现很多的如果,如果这样,如果那样。但最后还是要坚强的面对现实,学会理解,放下虚幻。</p>
<p>10月后的日子,重新投入到了工作中,凭借着一年的技术积累与实践经验,总算在一个月内,完成了对师傅采集程序的重构,并远远超出了原有程序的架构,运用了我所了解的全部技术。那段日子在工作上过的十分骄傲,数据采集流水线框架,成了我真正意义上的一个产品,一个实用的作品。那段时间总认为自己可以改变世界,正在改变世界,其实实事求是的说,我仅仅是沉淀了以往所有的技术积累,数据库,字符串处理,XML,INI,动态链接库。这些只不过是一个C++程序员的基本功而已,并不值得一提。网络、图形图像、并发处理,这些经典的领域还很遥远。可无论如何,我从中获得了满足与快乐,享受着这段不断实现想法的日子。</p>
<p>11月到12月,中途弄了阵Java,因为两位同事的调离,所以接替了他们的程序。并未感觉多么陌生,反而重新有了兴趣。甚至在网上找到一个很棒的SWING框架,琢磨了好几天后,突然发现它价格不菲,于是果断放弃了。又有几次开会推翻了之前的想法,一心要用什么ActiveX来做伪B/S。无奈我只好改用熟悉的MFC来迎接变化。轮到自己设计人机交互的程序了,才明白界面设计有多么的力不从心。我们只是程序员,哪来的美工那样挥手即来的艺术灵感。庆幸的是在今年的最后一天,这个采集配置器的小工具总算成型。我保证,这将是我最后一个MFC作品。。。</p>
<h1 id="总结">总结</h1><p>许是恋爱谈久了,写的文字又臭又长。在她面前小心翼翼不敢乱说话,自己写起来就各种大白话,不加修饰。能有耐心看到这里的,怕是只有我自己了吧。</p>
<p>总体来说,2012比2011过的更加奇幻,更加的有意义。有心摘的花没开,无心插的柳成荫。世事无常,人生无解。</p>
<p>最后废话几句吧:</p>
<ol>
<li>彻底阉割了考研梦,国内的研究生学习不值得向往,将目光聚焦大洋彼岸。</li>
<li>借用某人的话,研究技术不要秒射,年初的ios和ruby都是一时心血来潮之举。4月搞了一阵子C也是三天打鱼。要不是工作原因,C++都不会得到应有的沉淀。</li>
<li>工作了就不要和学生那样思维单纯,说话做事之前多想想,人际关系很微妙。守住底线,摈弃固执,沉住气,用心去理解。</li>
<li>不仅仅是技术,下半年回京后的英语、跑步都有间断,人最难对付的是懒惰。</li>
<li>仅发烧了两次,值得表扬,运动不能弃,身体最关键。</li>
<li>爱情,是顺其自然。</li>
<li>工作讲究划分责任,多听少说,多做少怨。注意积累工作经验与方法。</li>
<li>QQ交流最没效率,容易误会容易激动容易伤人,请拿起手边闲置的电话。</li>
<li>少说那么多道理,放下身段,听听别人怎么说,看看别人怎么活。</li>
</ol>
<h1 id="明年关键词">明年关键词</h1><p><strong>专注</strong>,<strong>坚持</strong>,<strong>放低自己</strong> ,<strong>大胆去做</strong>,<strong>沉住气</strong>。</p>
<p><em>英语要听</em>,<em>托福</em>,<em>C</em>,<em>学习前台网页设计</em>,<em>C++的基础</em>,<em>操作系统与网络</em>。</p>
<p>最后,但最重要:</p>
<blockquote>
<p>她</p>
</blockquote>
<p><--全文完--></p>