1. C语言
毫无疑问, 第一门语言是C语言. 我上大一的时候一样有疑问, 为什么中国的高校那么迂腐, 都什么年代了, 外面都Java了, 我们还在C… 还不是C++. 其实, 事实证明, 后来毕业的时候, 被人称作计算机的强人都是当年C语言程序设计考试考优的那几个人. 一个人对于C语言的态度, 其实一定程度上反映了这个人对于计算机科学和程序设计的热衷程度. 我们二三年级的班主任经常讲, 从事计算机工作, 一定要对编程抱有兴趣, 否则是无论如何也学不好的. 如果你发现你对编程根本没有兴趣, 建议趁早转专业. C语言考试当中如果有超过5处地方有问题, 就是不合格. 对于谭浩强版C语言书里面的知识点, 不能有任何疑问. 这也就是为什么谭浩强版C语言教材至今仍在中国书店计算机及网络类畅销排行第二名的原因.

2. C++
C++是不能绕开的一门语言. C++是一种思想, 不学C++不知道Java或者C#的好. 苦其心志是必要的, 虽然我对于C++依然反感的很… 太复杂太混乱太危险了. 不过, 我同样认为, 对于计算机系学生来说, 经过自己的体验知道C++为什么太复杂太混乱太危险是很有必要的. 此外, C++应该是你从TC转向Visual Studio 2005的跳板. C++是一门系统编程语言, 不适合用来写应用程序.

3. HTML/XML/CSS
必须精通的技术. 迟早一天, 所有程序都被XML化. 目前的趋势是WPF已经把应用程序界面表示XML化, DBMS也以支持XML作为重要的大版本特性. 何况, 计算机专业要想挣钱, 网站是必须要做的… 之于CSS, 初学者就不要经历我们走过的那些阴沟了吧. 听W3C的没错. 说起来我做网页也有10个年头了, 初中就开始写HTML, 完全是看HTML标准成长起来的一代人, 那时候还幼稚的很, 当发现可以用表格组织网页框架结构的时候, 欣喜若狂, 自认是个天才, 四处找人想分享经验, 才发现高处不胜寒. 如今, Div+CSS已经变成了我标准的工作语言, FrontPage和Dreamweaver则是早就早就不用了的古董了. UltraEdit是我的最爱.

4. JavaScript/AJAX
如果想走网站这条路, 精通JavaScript是必要的. JavaScript是一门类C语言, 学起来比较轻松, 而且因为JavaScript出了名的难以调试, 可以锻炼程序调试技术. JavaScript技术路线走下去就是大红大紫的Ajax了. 其实没什么, JavaScript和DOM戏法而已.

5. 对Visual Basic的态度
我不建议学习Visual Basic. 将VB纳入.NET框架实际上是一个失误. 从那一刻起, VB就已经死去. 计算机系的态度是, 各科课程设计不能使用VB编写.

6. ASP或PHP
网站路线必经之路. 因为ASP是类VB的, 所以我觉得不太值得为了ASP学VB. 因此, 类C的PHP更有价值, 而且PHP这么多年还活得好好的. 有必要把PHP作为轻量级的后台编程语言.

7. Database
MySQL和SQL Server以及Oracle最好都学习一下. 重点是前两个. Oracle实在是用不起. 占用资源太大, 不适合在自己机器上做试验. MySQL是PHP支持最好的数据库, 走网站路线的建议选择.

8. WWW和Hosting
网站路线的人不可避免的要接触域名系统和托管之类的事情. 这其实是一门学问, 书上很少讲, 却是很大很深的学问. 主要包括, 域名系统, 域名怎么解析, A记录, CNAME, MX记录是怎么回事; DNS怎么工作; 什么是虚拟主机等等. 注册一个属于自己的域名, 会对你将来找工作有很大的作用的. 用网站技术建立自己的个人主页, 然后才能搞明白Google好在哪里(Apps), 什么是SEO(又是一门大学问).

9. Java和C#
Java是一头大象了. Servlet, Swing, JSF, JSP… 名称太多太多了点… 还是C#干净点… 选择那条路, 与其说是技术问题, 不如说是政治问题, 我觉得C#好一点, 必经Sun终归要被并购掉… 微软语言的成败, 不是有语言特性决定, 而是微软平台的成败决定. 因此, C#也有风险. Java路线的话, 后面有网站后台的Servlet和JSP, C#路线则是ASP.NET. 不学PHP也无所谓. 就是主机贵一些.

10. 操作系统
这也是一个政治问题… Windows 2003/2008是肯定要会玩的, 必经和XP/Vista那么近似, 如何在机器上架设Web服务器, 安装动态语言, 架设DBMS是基本功. 因此, 需要精通IIS/Apache/Tomcat. Linux肯定要学. 哪个发行版本我不在乎, 基本Shell命令要烂熟于心.

11. 计算机硬件
有了这些, 可以出去打工赚点小钱, 出去打工, 为自己配一台好电脑吧. 搞清楚CPU阵营, 显卡阵营, 主板阵营, 硬盘品种, 怎么超频. 组成原理, 系统结构, 汇编语言是要好好学的. 为了你将来的水平成长.

12. 设计模式
编程到这里, 基本已经饱受不恰当的系统设计折磨之苦了. 看看设计模式, 看看代码大全, 让自己变成一个爱干净的人, 代码里没有意义的空行甚至空格也不要有. 注释, 用英文写起来啦. 这是, 你就是别人眼里的高手了.

13. 算法
为了生存, 为了面试, 算法是必须精通的一步. 算法导论是一个不错的选择, 别问我英文版好还是中文版好, 都买下来, 随着MIT视频教程, 仔仔细细拿出一年时间来, 学好算法.

差不多了. 毕业吧.

在某些CVS中, 一个目录存在的前提是该路径下有文件. 不包含任何文件的目录是不存在的. 因此, 软件大牛们(如MSRA FTEs)建立一个项目的时候, 会建好项目的目录结构, 每个底层目录里包含一个空文件, 取名为”placeholder”. 处身这样的环境中的时候不觉得什么, 把目录所在的模块的代码实现出来, 添加到这个目录中, 删掉”placeholder”就可以了. 此其一.

工程技术中的大多数问题, 如果你能够把问题描述清楚, 问题基本也就解决了. 只要拿描述去问Google就行. 此其二.

PlaceHolder的艺术

软件系统设计是一门艺术, 设计师要在项目实现之前把项目想清楚, 模块化. 这个过程可以借助很多工具, 我觉得最好的工具其实就是Windows Explorer, 项目目录建好了, 模块也基本出来了. 实现部分, 无非是麻烦而已. 因此, 软件系统设计其实就是PlaceHolder的艺术.

在MSRA的时候, 就发现, Font之于Designer, 就像Weapons之于Soldier, 或者IDEs之于Developer.

没错, 我就是忠实的Fixedsys爱好者~

初识Fixedsys, 绝对是一年级的时候使用VC++ 6.0的遗念. 那个时候还不懂什么TrueType, 像素, 等宽字体之类的事情, 只是觉得VC++ 6.0编辑窗口的字体看起来比较爽, 看多了爽多了就离不开了, 转到Visual Studio 2003的时候真的叫一个不适应啊, 宋体怎么显示代码… 后来发现VS可以设置字体… T_T

于是乎, 所有的编译器, 都被我设置成了Fixedsys, 目前在用的几种都是这样, Visual Studio 2008, Eclipse, UltraEdit和NetBeans一样不能少…

看看桀骜不驯的Eclipse变成了什么样子~

eclipse2.gif

可惜, 到了Linux上就没有了… 不过, 今天发现一个好东西, TrueType的Fixedsys, 这个东东可以在Linux上用, 同样可以在只支持TrueType的Java程序上(如NetBeans)用.

这里是下载链接 fixedsys500c.zip

达到最佳效果的字体大小设置:
You´ll often find that font size 11 gives the best results
When using Java try font size 15 (Windows) or 14 (Linux?).

http://fixedsys.moviecorner.de/index.php?p=download&l=1

最近上课的时候仔细想了想暑期实习和工作的事情, 从别人眼里发现我这个人的性格还是比较清晰的. 根据性格选择工作, 应该是比较理想的工作. 今天又仔细想了想离开亚洲研究院的时候Min Wang对我说的一段话, 促使我写下这篇日记.
下面的排序是个人喜好, 不代表一开始的职业… 估计不会有公司一上来就招我做系统设计师吧.

  • 1. 服务器/数据库 管理员
    我喜欢把自己能够控制的区域整理得干干净净. 多年以来, 我自己的机器从来不会有哪个文件夹放在错误的地方, 每个硬盘分区都有它专门的用处, 根目录不超过10个文件夹, 更不会有文件在根文件夹… 在同济网几年来维护服务器, 这些癖好成就了一个干干净净的服务器. 数据文件结构井井有条, 性能稳定.
  • 2. Technology Lead of UI
    这个职位是我的学长, 现在微软亚洲研究院的JTH的工作, 由Min Wang总结的一个叫法, 真的, 跟像Xiangwei, Xiao Yang, Yiwen, Jun Wang, Chiqing这样的专业UI一起工作是件非常爽, 非常舒服, 非常高效的事情.
  • 3. 系统设计师
    跟MSRA的PM Peng Xu学习的结果就是对系统设计的另一番认识. 写程序写多了, 对于系统设计的认识就有更加深刻的理解. 现在写程序比原来效率高多了, 究其原因, 是出色的系统设计使然, 计算机是一门综合的科学, 在我心目中, 设计模式这门学问的位置达到了空前的高度.
  • 4. 程序员
    当一个普通程序员也不错的. 我办事比较快, 一般充当救火队员的角色, 在MSRA的工作总结下来每天的编码量最少300, 最多达到1000+. 更加欣慰的是听到我的Mentor Haidong说, 我做事情很快, 编码质量也不错.

同济大学学生会是个很差的组织, 但是却有一个impressive的Logo和一句很有深度的Slogan, 我觉得用在这里很合适.

自觉觉人

现在的学生, 最缺少的就是自觉. 最多余的就是一颗FQ心. 哎呀, 扯多了. Coding去.

这是来自新加坡国立大学的一个页面,它记录了一个程序员从入门到精通,再到黑客,再荣升经理和CEO时所写的代码,
正如我们访客(注: cnbeta的访客)所评论的那样,这位程序员从青蛙变成了蛤蟆,相信同为程序员的你,看了之后您会会心一笑,我们的生活何尝不是如此呢?

High School/Junior High 10 PRINT “HELLO WORLD”
20 END
First year in College program Hello(input, output)
begin
writeln(‘Hello World’)
end.
Senior year in College (defun hello
(print
(cons ‘Hello (list ‘World))))
New professional #include
void main(void)
{
char *message[] = {“Hello “, “World”};
int i;for(i = 0; i < 2; ++i)
printf(“%s”, message[i]);
printf(“\n”);
}
Seasoned professional #include
#include

class string
{
private:
int size;
char *ptr;

public:
string() : size(0), ptr(new char(‘\0’)) {}

string(const string &s) : size(s.size)
{
ptr = new char[size + 1];
strcpy(ptr, s.ptr);
}

~string()
{
delete [] ptr;
}

friend ostream &operator <<(ostream &, const string &);
string &operator=(const char *);
};

ostream &operator<<(ostream &stream, const string &s)
{
return(stream << s.ptr);
}

string &string::operator=(const char *chrs)
{
if (this != &chrs)
{
delete [] ptr;
size = strlen(chrs);
ptr = new char[size + 1];
strcpy(ptr, chrs);
}
return(*this);
}

int main()
{
string str;

str = “Hello World”;
cout << str << endl;

return(0);
}
Master Programmer [
uuid(2573F8F4-CFEE-101A-9A9F-00AA00342820)
]
library LHello
{
// bring in the master library
importlib(“actimp.tlb”);
importlib(“actexp.tlb”);

// bring in my interfaces
#include “pshlo.idl”

[
uuid(2573F8F5-CFEE-101A-9A9F-00AA00342820)
]
cotype THello
{
interface IHello;
interface IPersistFile;
};
};

[
exe,
uuid(2573F890-CFEE-101A-9A9F-00AA00342820)
]
module CHelloLib
{

// some code related header files
importheader();
importheader();
importheader();
importheader(“pshlo.h”);
importheader(“shlo.hxx”);
importheader(“mycls.hxx”);

// needed typelibs
importlib(“actimp.tlb”);
importlib(“actexp.tlb”);
importlib(“thlo.tlb”);

[
uuid(2573F891-CFEE-101A-9A9F-00AA00342820),
aggregatable
]
coclass CHello
{
cotype THello;
};
};

#include “ipfix.hxx”

extern HANDLE hEvent;

class CHello : public CHelloBase
{
public:
IPFIX(CLSID_CHello);

CHello(IUnknown *pUnk);
~CHello();

HRESULT __stdcall PrintSz(LPWSTR pwszString);

private:
static int cObjRef;
};

#include
#include
#include
#include
#include “thlo.h”
#include “pshlo.h”
#include “shlo.hxx”
#include “mycls.hxx”

int CHello::cObjRef = 0;

CHello::CHello(IUnknown *pUnk) : CHelloBase(pUnk)
{
cObjRef++;
return;
}

HRESULT __stdcall CHello::PrintSz(LPWSTR pwszString)
{
printf(“%ws\n”, pwszString);
return(ResultFromScode(S_OK));
}

CHello::~CHello(void)
{

// when the object count goes to zero, stop the server
cObjRef–;
if( cObjRef == 0 )
PulseEvent(hEvent);

return;
}

#include
#include
#include “pshlo.h”
#include “shlo.hxx”
#include “mycls.hxx”

HANDLE hEvent;

int _cdecl main(
int argc,
char * argv[]
) {
ULONG ulRef;
DWORD dwRegistration;
CHelloCF *pCF = new CHelloCF();

hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

// Initialize the OLE libraries
CoInitializeEx(NULL, COINIT_MULTITHREADED);

CoRegisterClassObject(CLSID_CHello, pCF, CLSCTX_LOCAL_SERVER,
REGCLS_MULTIPLEUSE, &dwRegistration);

// wait on an event to stop
WaitForSingleObject(hEvent, INFINITE);

// revoke and release the class object
CoRevokeClassObject(dwRegistration);
ulRef = pCF->Release();

// Tell OLE we are going away.
CoUninitialize();

return(0); }

extern CLSID CLSID_CHello;
extern UUID LIBID_CHelloLib;

CLSID CLSID_CHello = { /* 2573F891-CFEE-101A-9A9F-00AA00342820 */
0x2573F891,
0xCFEE,
0x101A,
{ 0x9A, 0x9F, 0x00, 0xAA, 0x00, 0x34, 0x28, 0x20 }
};

UUID LIBID_CHelloLib = { /* 2573F890-CFEE-101A-9A9F-00AA00342820 */
0x2573F890,
0xCFEE,
0x101A,
{ 0x9A, 0x9F, 0x00, 0xAA, 0x00, 0x34, 0x28, 0x20 }
};

#include
#include
#include
#include
#include
#include “pshlo.h”
#include “shlo.hxx”
#include “clsid.h”

int _cdecl main(
int argc,
char * argv[]
) {
HRESULT hRslt;
IHello *pHello;
ULONG ulCnt;
IMoniker * pmk;
WCHAR wcsT[_MAX_PATH];
WCHAR wcsPath[2 * _MAX_PATH];

// get object path
wcsPath[0] = ‘\0’;
wcsT[0] = ‘\0’;
if( argc > 1) {
mbstowcs(wcsPath, argv[1], strlen(argv[1]) + 1);
wcsupr(wcsPath);
}
else {
fprintf(stderr, “Object path must be specified\n”);
return(1);
}

// get print string
if(argc > 2)
mbstowcs(wcsT, argv[2], strlen(argv[2]) + 1);
else
wcscpy(wcsT, L”Hello World”);

printf(“Linking to object %ws\n”, wcsPath);
printf(“Text String %ws\n”, wcsT);

// Initialize the OLE libraries
hRslt = CoInitializeEx(NULL, COINIT_MULTITHREADED);

if(SUCCEEDED(hRslt)) {

hRslt = CreateFileMoniker(wcsPath, &pmk);
if(SUCCEEDED(hRslt))
hRslt = BindMoniker(pmk, 0, IID_IHello, (void **)&pHello);

if(SUCCEEDED(hRslt)) {

// print a string out
pHello->PrintSz(wcsT);

Sleep(2000);
ulCnt = pHello->Release();
}
else
printf(“Failure to connect, status: %lx”, hRslt);

// Tell OLE we are going away.
CoUninitialize();
}

return(0);
}
Apprentice Hacker #!/usr/local/bin/perl
$msg=”Hello, world.\n”;
if ($#ARGV >= 0) {
while(defined($arg=shift(@ARGV))) {
$outfilename = $arg;
open(FILE, “>” . $outfilename) || die “Can’t write $arg: $!\n”;
print (FILE $msg);
close(FILE) || die “Can’t close $arg: $!\n”;
}
} else {
print ($msg);
}
1;
Experienced Hacker #include
#define S “Hello, World\n”
main(){exit(printf(S) == strlen(S) ? 0 : 1);}
Seasoned Hacker % cc -o a.out ~/src/misc/hw/hw.c
% a.out
Guru Hacker % cat
Hello, world.
^D
New Manager 10 PRINT “HELLO WORLD”
20 END
Middle Manager mail -s “Hello, world.” bob@b12
Bob, could you please write me a program that prints “Hello,
world.”?
I need it by tomorrow.
^D
Senior Manager % zmail jim
I need a “Hello, world.” program by this afternoon.
Chief Executive % letter
letter: Command not found.
% mail
To: ^X ^F ^C
% help mail
help: Command not found.
% damn!
!: Event unrecognized
% logout

中文原文: http://www.cnbeta.com/articles/38875.htm
英文原文: http://sunsite.nus.edu.sg/pub/humour/prog-evolve.html

第二次进机房维护,这次终于搞定。上次去了Redhat Linux自带的Adaptec aic-7902的驱动加载了一半会卡住,当时失策地只带了一个发行版本(宿舍还有几个,当时为什么没带,想不通…)没办法只好拔了新硬盘换上旧的,打道回府。答辩完了之后气势汹汹带了N个Linux发行版本(Redhat AS4,CentOS,Ubuntu,Fedora Core,Windows 2003)就不信没一个能装得上…然后各种版本试了一遍,出现各种各样不同的问题,有的没驱动,有的卡住死机,有的光盘缺文件…终于,Fedora最终在我心惊胆颤下表现稳定,顺利安装好。

回来又做了一上午性能优化和一下午BUG修正(丢失了一些数据),估计修正到明天中午,同济网服务器应该可以以一个崭新的面貌迎接下面的5年~真希望能像jth和payaqa两位前辈一样,装个机器稳定跑3年。

放个机房照片,左上角插着我的光驱的就是同济网服务器~进机房是我从小到大一直的梦想…终于实现了,原来,机房里这么冷啊…

pict00173.jpg

有人说写论文就像生孩子,这话一点不假,这样我这学期生了两个孩子,一篇论文,一个系统….都是心血啊。波折很多,不堪回首啊。3月的时候差点因为硬盘分区表问题丢了系统源代码…紧张死了。最后的系统与我想像的功能还差一些,无奈时间限制,也只好这样作罢,还好各级指导老师都还比较满意,夸奖我“工作量大”。废话,相比那些代码1000以内的,甚至计算机系2/3学生一行代码不用写,写篇论文搞定毕业的人来说,我这样所谓“公派”南京开会的,在一帮子学心理学的把我认成老师的博士硕士当中一点一点写代码的,真是凤毛麟角~哈哈

留个纪念吧,下次见,还不知道什么时候呢。

pict00171.jpg