CSDN流金岁月

CSDN七周岁了,七年是一个很短的时间,但是在IT的领域似乎又是一个漫长的岁月,回想七年前的往事,觉得是如此的陌生却又有一丝亲切。

认识CSDN应该是一个偶然,那时(具体什么时候记不得了)还是在玩VB的时候,一开始总是苦于找不到参考资料,后来听人说有个叫“MSDN” 的东东里面有详细的参考资料,就去寻找D版的光盘,找到一套两张名为“程序员大本营”的光盘,里面有MSDN,还有百联美达美出的“程序员大本营”,内容 好像就是最早CSDN上的文档和资料。

什么时候注册的CSDN帐号实在是不记得了,还好CSDN论坛的个人信息中还包含这项,一查是2000年 5月20日,大概记得是在学校当时唯一一个可以上网的机房在一台486的电脑上注册的。我自己的电脑中保留的资料中最早的有关CSDN的邮件是2000年 5月26日的。内容如下:

lifanxi您好:

关于:如何在VC++中建立如同VB中的控件数组?

korn提供了如下回答, 请您查阅和评估:
---------------------------------------------------------------------------
经过长时间的实践:赫赫,终于知道了
  如果是要静态数组的话(即个数事先确定的话还是较简单的):
    1.选择Menu--View菜单项底下的resource  symbols 中声明一些连续的资源ID.
      比如:IDMYBUTTON  VALUE 102  .....后面的一些Value值空着就可以了.
    2.在控件创建时,使用上面的资源ID就可以乐!
      在.H文件中定义控件数组:
          CButton * m_pButton[4];
      在.CPP文件中(一般是在比如Dialog 的InitDialog()函数中实现):
          for(inti=0;i<4;i++)
          {
             m_pButton[i]=new CButton;
             m_pButton[i]->Create(_T("HeHe"),WS_CHILD and WS_VISVIBLE,
                   CRect(0,0,100,24),NULL,this,IDMYBUTTON+i);
          }
    3. 动态生成控件以后,肯定是要完成一定的功能了,你手工加上消息映射,找到
       afg_msg 你的消息函数 my();
       declare_message_map()  // (*.h 文件中)
       begin_message_map()
        ON_CONTROL_RANGE(BN_CKLICKED,IDMYBUTTON,IDMYBUTTON+4,my)
        .......
       end_message_map()     //( *.cpp文件中)
    4.然后就是编写你的my()函数了..
  赫赫...
---------------------------------------------------------------------------

如果这个回复已经解决了您的问题,请到论坛给分给回答您问题的用户。

目前您的专家分数:0、参与分数:131、可用分数:440。欢迎经常光顾,争取榜上留名。
问题:http://www.csdn.net/expert/TopicView.asp?id=9154
中国软件开发网络: http://www.csdn.net/
中国软件开发网络专家门诊: http://www.csdn.net/expert/

这个应该是我在CSDN专家门诊上问的第一个问题。那时是我在经历从VB向VC过度的最痛苦的时候(在瞎摸索,还没找到入门的道路),CSDN 网友热情回复让我觉得非常的感激,不过也很郁闷,这么专业的回复对于那时的我来说是一头雾水,完全看不懂,这也激发了我进一步学习的热情。

2001年7月,第一次有机会不是以按时计费拨号上网的方式来访问CSDN,所以第一次很积极的在CSDN上看贴回贴,那时主要看的版块应该是ASP和 VB和VC的版块。估计第一次拿专家分应该也是在那个时候。我的邮件中可以查到的拿专家分的记录是2001年12月3日的事情。

lifanxi您好:
    关于问题:请问vs7的winforms怎样使用控件数组。,
    您的解答获得提问人的好评,他已经将分数给你了。
    本次得分:2(专家分)
    您现在的专家分为:311
    您现在的可用分为:5187
    您现在的参与分为:2774
    请继续努力,争取榜上留名。

问题链接:http://www.csdn.net/expert/TopicView.asp?id=368967
论坛地址:http://www.csdn.net/expert/
中国软件网: http://www.csdn.net/

非常的巧合,在邮件中我能查到的我的第一个问题和我拿专家分的第一个问题都是有关“控件数组”的。只不过平台已经从VB6经过VC6一路变迁到VC#了,我自己也开始从单纯的提问人转变为可以回答一些简单问题的人了。

2001年也是第一次买正版的CSDN的东东,是程序员大本营2001的.NET增值版,58块钱。不过实话说我买它不是为了程序大本营,因为那里面的东西网上都能找到了,而是为了它附带的Visual Studio .NET 2001 Beta 2的光盘……

2001年时CSDN论坛的样子

2001年时CSDN论坛的样子

2002年开始是我自己猛学C++的时候,也是在CSDN开始C/C++生涯的时候,这种状态一直持续到2003年4、5月份。那时只要有机会 不限时上网(在家里和学校还是按时计费拨号上网的),就一定是打开CSDN的C/C++版块,狠狠的刷新页面抢最新的问题回答。那时也认识了不少CSDN 的网友,印象最深刻的是chinajiji(菜鸟叽叽),那时候我们一直在C/C++版块上抢分,有时甚至为了抢分都忽视了回答的质量,还好CSDN上热 心人是这么的多,一旦回答失误了,还是有很多的朋友可以及时指出并更正。这样不断交流的过程,也在无形中提高了自己的能力。

由于那时CSDN的计分制度是最高到达两星,三星及以上是不能简单通过挣专家分来达到的,所以当我挣满了两星级的专家分满足了自己虚荣心后,也 开始渐渐淡忘了CSDN专家门诊,当然这里面也还有另一个非常重要的原因是那段时间C/C++版块上有价值的问题和回答越来越少,取而代之的是很多人都深 恶痛绝的“作业贴”“考试贴”。

这里还有一个小插曲对我的影响也是很深刻的:在CSDN上得到一星后,我也对自己的C++开始有了更多的信心,于是也尝试着去国外的一些C++ 邮件列表回答问题,结果第一个问题就出师不利。有人问为什么float的0.001f用循环加上1000次输出不等于1,这个问题对于我来说太简单了,我 不假思索的回答到:因为float不是一种accurate的数据类型。然后做了一些简单的解释。很快就有别人回复到:”It pains me when people say this.” 并详细解释了为什么不能说float不是一种accruate的数据类型。因为float本身的运算是确定的,只是存在舍入的误差,所以不 能称它是一种不够accurate的类型,因为说不accurate给人的感觉就是float的运算结果是不确定的、不可预知的。经历这个事件,我更加意 识到CSDN的一星专家头衔,不是用来满足虚荣心的,它更多的也代表着一种责任,从那以后我在回答问题时也变得更加谨慎,也尽量让自己的回答能够既不引起 误解和困惑也足够严密。

第一次拿信誉分是2003-2-18,呵呵,不是我记性好,而是因为这个在CSDN论坛上还是有据可查。我信誉分多半也是在C/C++版块挣来的。

最早开始在CSDN文档中心写译技术文章是2002年2月16日,翻译了一篇Charles Petzold谈论.NET和C#的文章,那时正好是我刚刚看完Programming Windows不久又开始在接触.NET的时候,所以看到文档中心有这篇文章又正好有人希望看到中文版,我就把它翻译了。当然,在文档中心写文章也是抱有 “不纯动机”的。那时候只要在文档中心写译满6篇文章就可以申请成为专栏作家,可以拿免费的程序员杂志。写译文章实在都不是容易的事情,在我这个“动机” 还没有达到目的时,CSDN就开始提供Blog服务,并把逐步把文档中心和Blog进行了整合。不过在Blog上写写文章与大家分享心得却作为一个习惯保 留了下来。文章虽然写得很少,不过还是有两三篇文章上过CSDN首页,得出一个“经验”:只要写连载就很容易上首页,呵呵。不过实在是能力和精力都有限, 我的两个“连载”都是“蛇头无尾”(就是比“虎头蛇尾”还差),都在“连载”了三篇后就夭折了。

2003年以后,读研的生活一直是比较繁忙,技术学习的重点也发生过几次转变,CSDN就渐渐的淡忘了。只是把它作为一个Blog平台和IT新 闻平台来用,论坛就很少访问了。一直到前几天 Blog搬家来带的一点花絮才让我又一次记起了这个曾经给我很多的快乐很多帮助的地方。值此新年依始和CSDN七周年庆的时刻,写下这篇《CSDN流金岁月》与CSDN共勉,新的一年,祝愿CSDN有新的进步,也祝愿自己有更多的收获。

创意程序Pizza Party

上网看到一个通过命令行来订购比萨饼的程序,虽然程序简单,但却也很有意义,而且确实是创意无限。

这个程序的主页是http://www.beigerecords.com/cory/pizza_party/,上面有源程序下载一个DEMO视频。

其实想上去这个程序也没有什么神奇的地方,无非就是用程序给网站发送http请求,来模拟在Web上登陆网站并且订购Pizza的过程。

把源程序下载下来看了一下,果然不出所料,一个不到1000行的Perl脚本就完成了这样一个看来很神奇的工作。在我看来,虽然我不能在它所访问的网站上订购Pizza,但是这个程序还是挺有意义的。

这样一个短短的程序,完整了演示了如何使用Perl来完成一个http请求的发送和回应的接收和处理,由于涉及到网站的登陆,所以还包含了对 Cookie的处理。这个程序还包含了一个标准的Man Page,程序支持标准的*nix风格的长短参数处理。可以说,通过对这样一个小小程序的学习,就可以很快对使用Perl来进行简单的编程,尤其是Web 相关的编程有一个初步的认识。通过对这个小程序的简单修改,就可以把它用在很多不同的地方。对于初学者实在是一个不错的东东。

决定有时间来学习一下这个程序,这样以后写Blog的时候说不定就可以一键同时发布到自己的Blog和CSDN的Blog上了。不过CSDN Blog登录时需要输入图形验证码这点比较头疼,看来要全自动可能性是不大了……

一个偷来的创意

后天就是大年三十喽,传统意义上的新的一年就要来到了。也许八天长假也不是太长,不过我还是在这八天中计划好了一个不小的计划,那就是想去实现一个偷来的创意。

从去年开始工作以来一直希望能在工作中学到更多的知识,从团队中学到更多的经验,不过似乎这个愿望一直就没有真正的实现过,人人都在忙于完成的 自己工作而没有精力去学习和分享。不说别人,就算是我自己,也总是关注在如何去完成手头的工作而很大程度上忽略了学习。慢慢的,就觉得自己在工作中力不从 心了,出来混的,迟早是要还的。

去年年底公司的Trend Wish活动时,我的愿望”To have a better platform where Trenders can share their knowledge”被选为了最佳愿望之一。那时我也想过去建立怎么样的一个平台是一个最好的分享知识的平台。最先想到的是Wiki,所以就在自己机器上 用MediaWiki建了一个自己用的Wiki,但后来发现,作为一个协作平台Wiki是很好的,但作为知识分享平台,它存在不少的问题。最重要的一点就 是读者反馈非常的不直接,除了讨论页上可以讨论外,很难直接的知道自己分享的知识对别人是不是有用。作为读者,也难从大量的信息中找到对自己有用的信息。

最近,一个创意跃入我的脑海,我决定自己来搭建一个“我知道”的知识分享平台,这个创意其实是从豆瓣网 偷来了,在豆瓣上,大家可以分享“我看”(电影),“我听”(音乐),“我读”(书籍)等一系列的信息。我希望通过“我知道”这个平台,能让大家一起到上 面写下自己的知识,然后读者可以从中找到对自己有用的信息,并把这些信息进行记录,同时给发布者相应的反馈。虽然“我知道”这个平台与“百度知道”用了同 样的“知道”一词,不过我想他们是有明显的区别的,百度知道重在提问与回答,而“我知道”则是重在主动的知识共享。我也不知道是不是已经有成熟的平台可以 直接实现我这个创意,所以还是打算自己先按自己的想法实现一下试试效果。

由于自己对PHP的学习还是处在初级阶段,加上现有的条件也只有一个ASP空间,所以还是打算用非自由的ASP技术来实现我自己这个创意。如果 必要,可能会用到AJAX,不过这个技术我也还是不太了解,只是想尝试一下。风格上肯定会做得很朴素,就像豆瓣一样。功能上,也一定会是用迭代式的开发, 慢慢的去完善它。不过在设计上还是打算下一点功夫,争取可以有比较好的扩展性,也希望以后必要的时候可以移植成PHP重新实现一下。

添加了评论的功能

添加了评论的功能。目前这个功能是针对每个页面来做的,在哪个页面上发表的评论就会出现在哪个页面上。所以如果要对文章评论,请进入相应文章的页面,不然就都堆在首页上了,谢谢合作,呵呵:)

可用性测试

工作一直紧张,但今天还是岔出了一件事情,就是对我负责的模块进行用户可用性测试。两个小时的测试还是有点收获,小记之。

刚刚从公司的培训课程中学到了”Usability Test”,没想到这么快就用到了实践中,虽然这次的可用性测试不是很正式的从公司外部请用户来做,也没有用单面透视玻璃对用户行为作“暗访”,但同样达到了一定的效果,找出了产品中的一些问题。

今天的测试是请用户按照产品的文档完成产品的安装和一个Kernel模块的安装。在写那份文档的时候,我已经自以为很充分的考虑了各种情况,为不同的用户,不同的场境进行了描述,原以为问题不会太大,没想到测试的结果很让我惊讶。

  • 用户根本不看文档。如果作为一个有经验的用户,也许在拿到软件包时就是自信的打入./configure && make && make install来完成安装。原以为这次用户在我们强调了文档的情况下用户会看文档,结果用户还是没有看,只有在遇到问题时才会想到文档。准备了 README和INSTALL两个文档,原以为用户会看INSTALL,没想到用户总是喜欢挑短的README看,有详细步骤的INSTALL就不愿意 看。
  • 当用户发现做不下去要看文档时,我们发现用户只喜欢看文档中列出的命令,而对于命令前后的解释性文字一率是视而不见。但用户有时又无法分辩到底他 看到的是句子还是命令。如果文档中列出的命令用户不熟悉,或者看不懂,他操作起来会很没有信心。用户有时无法区分”INSTALL”文件和”make install”这条命令中的install有什么区别。
  • 用户无法看到文档中的重点,当大篇的文字出现在屏幕上时,用户无法找到文章中的重点,三位测试人员不约而同的对文档中对他们完全没有用处的一段文字表现出极大的“兴趣”。
  • 用户不看屏幕的提示,屏幕用大写字母打出WARNING时,用户仍然不加思索的回答yes,继续有危险的步骤。
  • 用户记不住自己做过的事情和屏幕上的信息,仅管文档提醒用户要记住一行提示,用户仍然不会去记它。
  • 如果不在文档开始的地方提醒用户可以把文档打印出来看,用户想不到把文档打印出来放在手边。
  • 用户对终端上出现的彩色的字符比较敏感,如果把上面那用户看不到的大写WARNING改成闪动的红色字符也许就很容易引起他们的注意。
  • 如果用户在努力很久后,完成了安装过程,但产品却没有正常工作,用户会非常沮丧。
  • 当用户第一次失败时,他会认为是自己的错误,如果连续两次失败,他会对产品失去信心。
  • 如果用户的相关经验可以指导他直接完成任务,事情会很顺利。如果他的经验无法让他直接得到正确的结果,他完成任务的效率会比没有经验的更差。
  • 用户如果不熟悉命令行,让他做命令行的操作会非常痛苦,给他命令依样画葫芦也没用。
  • 用户希望文档可以步骤更清楚,而不一定要列出太多的信息。用户希望有Wizard形式的安装过程来代替文档。

其实当我列出这些条条来后,反而感觉不是那么惊讶了。这些不都是我们平时在用软件时的一些习惯吗?只不过怎么在做软件时真正把用户的这些体验设 计进去,真正做到以用户体验为中心的设计,这才是真正很难做到的。程序员总是在写程序时把程序的思路放进产品,而很难把用户的体验放进去。

实话说,我一直觉得自己在做程序时是很注重用户体验的,但经历今天的可用性测试才发觉,可用性和良好的用户体验存在于产品的每一个角落。以前我 总是太Focus在一些细节的地方,精确到每一个快捷键的设计、图片一个像素的位移这些很细微的角落,有时却忽视了整体上的可用性。

同时,可用性的实现,尤其是一些细节上的东西,往往会跟产品的开发周期和Schedule形成相互的制约,怎么在这种相互的制约下达到一个最好的平衡,也是一个要在实践中反复体会的话题。