博文
VC程序员的命运(2007-01-17 23:06:00)
摘要:从小狼上转的,因为我也是学习VC的,自认为前途一片光明,看了这篇文章,有所感触,感觉写的很好,我现在还有1年时间就要毕业了,这篇文章为我敲响了警钟。
文章:VC程序员之无法选择的命运
http://community.csdn.net/Expert/topic/5286/5286537.xml?temp=.5930445
许多人选择做程序员,因为觉得程序员做的是创造性的工作。
许多人选择做VC程序员,因为想感受掌握一切,君临天下的感觉。
后来,程序员们都明白了:自己所做的,只是最机械、最重复的劳动。我们并未创造着世界,而是让世界死死地牵着鼻子走。我们一步也不敢停留,害怕着会因此与世界失去联系。
再后来,程序员知道了除了写程序之外,还要吃饭。许多程序员找到了工作,唯唯诺诺地写公司规定的代码,过上了任人鱼肉的生活。VC程序员却由于一直找不到工作,流浪街头。
其实,选择做程序员,就意味着比别人受更多的苦。选择做VC程序员,就意味着比别人走更多的弯路。因为我们没有好的书籍参考,没有好的老师指导,没有好的环境实践……我们孤独地在眩目的显示器前或在漆黑的夜里苦苦摸索,寻求出路。然而,蓦然回首,离自己的目标已渐行渐远……
数百个VC程序员联系上我,说找不到工作,有的说要到我公司来。我要求他们设计一个最简单的项目,但他们都似乎有心无力,屡屡犯错。我知道,这并不是因为我们的VC程序员不认真,不努力。而是在这盲目的大潮中,程序员们找不到方向。举个例子,当今的VC书籍可不能不谓浩如烟海,但真正有用的没有几本。写书的人欺骗着一批又一批的莘莘学子,让一大班程序员跟着他的屁股去啃那些枯燥无味并大多无用的东西。当程序员们探索得有点眉目的时候那技术早已经不流行。如MFC,来不及让程序员们真正理解,却显江河日下。
我知道,真正让你有进步的行为是进一家软件公司做一个项目。那时,你会真正感受到一日千里是怎么一回事。但是VC朋友说要到我公司来,我总是拒于千里,理由是不能给公司带来效益。公司不是慈善机构,要培养一个VC程序员也不是一朝一夕的事情。朋友说,我们可以合作,这样总可以帮上公司一点忙吧。......
程序员高手是怎样炼成的? 转(2007-01-14 12:43:00)
摘要:估计很多的朋友在很小的时候就看过奥斯特洛夫斯基同学的《钢铁是怎样炼成的》,偶小时候在农村混,看的最多是各式各样的牛屎以及长得极象牛屎的山头,这些所谓的名著偶直到大学才有机会拜读,但说实话,偶是个俗人,还是更喜欢看一些痞子写的文字或带COLOR的BOOKS。偶之所以写这么个主题,主要是太多的朋友给偶发EMAIL或在VCHOME.NET提问,偶其实也与大家一样为生活而奔波,因此没有时间一一作答,在这作一次回答,还望海涵。
高手是一个哗众取宠的词汇,世上本来并没有高手,说的人多了也就有了高手,我看程序员只有老少之分,并无高低之分,比如偶就是一个老程序员,因此作为程序员,我们追求的应该是写出有用有价值的软件产品,呵呵,废话少说,切入正题吧!
1.迷恋 + 热情;
爱因斯坦同学说:兴趣是最好的老师,这就是说一个人一旦对某事物有了浓厚的兴趣,就会主动去求知、去探索、去实践,并在求知、探索、实践中产生愉快的情绪和体验,并不断地激发学习的动力,这种说法很美妙,众所周知,程序员是一种有点乏味有点枯燥有点辛苦的技术工作,要能坚持下去,并能做得很好,没有迷恋没有热情是很难很难的,偶就很迷恋,迷恋C++,迷恋computer,迷恋network,偶迷恋for、if、while、case等等就如同歌手迷恋五线谱的小蝌蚪一样,我觉得程序代码真是无所不能,简简单单的几行代码就能实现丰富多彩的功能,你难道不觉得很NB吗?呵呵,因此,作为一名老程序员,我建议年轻的程序员们一定要对coding保持迷恋保持热情,那样我们才有可能做得更好。
2.在项目中磨练与成长;
很多朋友经常问:他看了很多书,也做了较多的练习,但感觉水平并没有得到提高,这是为什么?呵呵,我觉得每个人不同,有些程序员通过看书,也能学到很多东东,但我个人觉得最好的提高方法,还是要参与到某一项目中去锻炼,从设计到开发到测试到维护一整套的磨练流程,项目是有周期的,有周期就有压力,有压力才能不分昼夜地去学习与实现,学习的效果也会很显著与深刻。
3.数不胜数的加班;
偶这里所讲的加班并不单指工作上的OT(即overtime),而更多的是学习上的OT,偶认为程序员学习的黄金时间在毕业后的前三年,这三年你如果有一个好的环境好的......
唐骏:别看盖茨有钱 一点精神寄托没有(2007-01-14 12:28:00)
摘要:
唐骏:别看盖茨有钱 一点精神寄托没有
2007.01.11 来自:TECHWEB
几周前,我去华尔街做了一次路演。在整个路演当中,盛大的股价提升了30%,从15块一股变成了20块。随后,一家国内著名媒体登出了这么一篇报道,题目是:“唐骏用45分钟忽悠了540万美金”。虽然其中我确实花了45分钟时间说服投资者购买了30万股,但那个记者用了一个让我难以接受的方式——说我“忽悠”了540万美金。“忽悠”这个词确实很不好听,所以我打电话对他说,你怎么可以这么写唐骏呢?这不是把我的形象毁了吗?他说,唐骏,你不知道,老百姓根本不懂你们这个行业的事,什么上市?你们做老板的人才会说上市,融资也就是做资本的人才知道;对我们老百姓来说,只知道圈钱,说你忽悠人家钱是好听的,没有说你骗人家钱就已经很好了。
他还说,媒体的目的就是把信息传递给每个人,所以要吸引人的眼球,要让文章写出来有人看;如果我写唐骏花45分钟融资540万美金,有人看吗?除了你和我,没人看!我想,这确实有道理,翻看一下报纸,什么新闻传得最快?一定是八卦新闻。所以要想炒作,最好是来点绯闻。还好我没什么绯闻。
所以做企业真的很难,想把企业变得有名一点,又希望绯闻少一点;但是绯闻少一点知道的人就更少了。由此,我们引入今天的话题:未来企业营销的手段是什么。人们在生活中常常感觉很压抑,希望有自由的空间放松一下。放松的方式很多——当然我坚决反对低级的放松方式。让人放松的最简单方法就是娱乐。不娱乐不行,传统的营销模式肯定在今日市场中走不下去。
我给大家讲一个八卦的故事。我在微软时,经常有机会跟盖茨交流,他比我们娱乐得多。我就通过营销的方式跟他讲。
我说,世界上很多人在研究宏观经济,估计没什么人能研究透彻,除了我之外!看一下上世纪整个80年代的经济,日本经济从0.5%的低速增长,到1985年开始5.3%的高位增长,发生了什么呢?有个事件,经济学家们忽略了,有个人到了日本。到了1990年不知道怎么回事,日本经济一下子全面崩盘,发生了什么?什么都没有发生,只是有一个人离开了日本。美国经济在上世纪80年代也是处于低迷状态,但是到1990年,一下子萌发起来了,微软、英特尔、思科等一系列高科技企业带动了经济发展。只发生了1件事,有个人来到了美国。我知道,这跟这个人没有太大关系,但是没办法。199......
在堆上分配内存 (2007-01-13 23:22:00)
摘要:在堆上分配内存 关键词: 在堆上分配内存
可能许多人对内存分配上的“栈 stack”和“堆 heap”还不是很明白。包括一些科班出身的人也不明白这两个概念。我不想过多的说这两个东西。简单的来讲,stack上分配的内存系统自动释放,heap上分配的内存,系统不释放,哪怕程序退出,那一块内存还是在那里。stack一般是静态分配内存,heap上一般是动态分配内存。
由malloc系统函数分配的内存就是从堆上分配内存。从堆上分配的内存一定要自己释放。用free释放,不然就是术语——“内存泄露”(或是“内存漏洞”)—— Memory Leak。于是,系统的可分配内存会随malloc越来越少,直到系统崩溃。还是来看看“栈内存”和“堆内存”的差别吧。
栈内存分配
—————
char*
AllocStrFromStack()
{
char pstr[100];
return pstr;
}
堆内存分配
—————
cha......
VC进行COM编程所必须掌握的理论知识(2007-01-05 14:04:00)
摘要:一、为什么要用COM
软件工程发展到今天,从一开始的结构化编程,到面向对象编程,再到现在的COM编程,目标只有一个,就是希望软件能象积方块一样是累起来的,是组装起来的,而不是一点点编出来的。结构化编程是函数块的形式,通过把一个软件划分成许多模块,每个模块完成各自不同的功能,尽量做到高内聚低藕合,这已经是一个很好的开始,我们可以把不同的模块分给不同的人去做,然后合到一块,这已经有了组装的概念了。软件工程的核心就是要模块化,最理想的情况就是100%内聚0%藕合。整个软件的发展也都是朝着这个方向走的。结构化编程方式只是一个开始。下一步就出现了面向对象编程,它相对于面向功能的结构化方式是一个巨大的进步。我们知道整个自然界都是由各种各样不同的事物组成的,事物之间存在着复杂的千丝万缕的关系,而正是靠着事物之间的联系、交互作用,我们的世界才是有生命力的才是活动的。我们可以认为在自然界中事物做为一个概念,它是稳定的不变的,而事物之间的联系是多变的、运动的。事物应该是这个世界的本质所在。面向对象的着眼点就是事物,就是这种稳定的概念。每个事物都有其固有的属性,都有其固有的行为,这些都是事物本身所固有的东西,而面向对象的方法就是描述出这种稳定的东西。而面向功能的模块化方法它的着眼点是事物之间的联系,它眼中看不到事物的概念它只注重功能,我们平常在划分模块的时侯有没有想过这个函数与哪些对象有关呢?很少有人这么想,一个函数它实现一种功能,这个功能必定与某些事物想联系,我们没有去掌握事物本身而只考虑事物之间是怎么相互作用而完成一个功能的。说白了,这叫本末倒置,也叫急功近利,因为不是我们智慧不够,只是因为我们没有多想一步。面向功能的结构化方法因为它注意的只是事物之间的联系,而联系是多变的,事物本身可能不会发生大的变化,而联系则是很有可能发生改变的,联系一变,那就是另一个世界了,那就是另一种功能了。如果我们用面向对象的方法,我们就可以以不变应万变,只要事先把事物用类描述好,我们要改变的只是把这些类联系起来的方法,只是重新使用我们的类库,而面向过程的方法因为它构造的是一个不稳定的世界,所以一点小小的变化也可能导致整个系统都要改变。然而面向对象方法仍然有问题,问题在于重用的方法。搭积木式的软件构造方法的基础是有许许多多各种各样的可重用的部件、模块。我们首先想到的是类库......
2005年11月华为在南邮的招聘笔试题(2007-01-05 13:48:00)
摘要:1.写出判断ABCD四个表达式的是否正确, 若正确, 写出经过表达式中 a的值(3分)
int a = 4;
(A)a += (a++); (B) a += (++a) ;(C) (a++) += a;(D) (++a) += (a++);
a = ?
答:C错误,左侧不是一个有效变量,不能赋值,可改为(++a) += a;
改后答案依次为9,10,10,11
2.某32位系统下, C++程序,请计算sizeof 的值(5分).
char str[] = “www.ibegroup.com”
char *p = str ;
int n = 10;
请计算
sizeof (str ) = ?(1)
sizeof ( p ) = ?(2)
sizeof ( n ) = ?(3)
void Foo ( char str[100]){
请计算
sizeof( str ) = ?(4)
}
void *p = malloc( 100 );
请计算
sizeof ( p ) = ?(5)
答:(1)17 (2)4 (3) 4 (4)4 (5)4
3. 回答下面的问题. (4分)
(1).头文件中的 ifndef/define/endif 干什么用?预处理
答:防止头文件被重复引用
(2). #i nclude 和 #i nclude “filename.h” 有什么区别?
答:前者用来包含开发环境提供的库头文件,后者用来包含自己编写的头文件。
(3).在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”声明?
答:函数和变量被C++编译后在符号库中的名字与C语言的不同,被extern "C"修饰的变
量和函数是按照C语言方式编译和连接的。由于编译后的名字不同,C++程序不能直接调
用C 函数。C++提供了一个C 连接交换指定符号extern“C”来解决这个问题。
(4). switch()中不允许的数据类型是?
答:实型
4. 回答下面的问题(6分)
(1).Void GetMemory(char **p, i......
用VC++在状态栏显示时钟 (2006-12-19 21:10:00)
摘要:在VC的控件中有个Status bar可以在窗体状态栏中添加日期和时间。其实通过简单的代码,你就能创建一个有时钟显示的状态栏,并且还能设置时钟栏的显示方式。举例如下:
首先,用MFC AppWizard按默认方式创建一个单文档界面的应用程序框架。
然后,编写代码:
1)在String Table中添加New String,在此定义为ID_INDICATOR_CLOCK,将其Caption设为00:00:00(由于状态栏根据Caption确定时间窗格的缺省宽度,使用此值将为时间的显示预留空间)。注意,本步操作时有两种方式:
一种建立新的String Table,并添加String;另一种则在原有String Table中添加。当用后一种方式操作时,若完成后,时钟栏并不显示时间,则需要将此New String在String Table中对应的Value值加1(可在resource.h中修改)。
2)在MainFrm.cpp中indicators声明处添加ID_INDICATOR_CLOCK,代码如下:
…
static UINT indicators[] =
{
ID_SEPARATOR,
ID_INDICATOR_CLOCK,
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
…
这一步中ID_INDICATOR_CLOCK的插入位置将影响时间窗格在状态栏中的显示位置。
3)安装定时器:在MainFrm.cpp中OnCreate函数处添加代码如下:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{ ……
SetTimer(1,1000,NULL);//安装定时器,并将其时间间隔设为1000毫秒
return 0;
}
4)编写时间处理函数:利用ClassWizard为CMainFrame类加入WM_TIMER的消
息处理函数OnTi......
改变应用程序的外观(2006-12-19 20:21:00)
摘要:第一部分 改变应用程序的外观
一、 问题:要修改一个应用程序的外观,应该在应用程序创建之前还是在创建之后修改呢?
修改一幢楼房应在建成之前,应在窗口创建之前修改。要改变一个框架窗口的外观,应在CMainFrame::PreCreateWindow()中去改变,
CREATESTRUCT cs结构体的类型和个数与创建窗口的CreateWindowEx()的个数和类型是完全一致的。只是顺序正好相反。
PreCreateWindow(cs)的参数cs被声明为一个引用类型,如果在子类中修改了cs的值,这种改变会反应到MFC的底层代码中。
1、修改窗口的大小:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
cs.cx=300;
cs.cy=200;
return TRUE;
}
2、修改窗口的标题
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
&......
如何向 CImageList中加入位图文件(2006-12-12 18:45:00)
摘要:在MFC中CImageList类封装了图象列表控件的功能,图象列表控件是相同大小图象的一个集合,用于应用程序中大规模图标的存储,该控件是不可见控件,通常与其它控件一起使用,来为其它控件提供图标资源。图象的每个集合中均以0为图象索引基数,可以把这些图标看成是以数组方式存储的,图像列表通常由大图标或位图构成,其中包含位图模式,实际上,所有的在同一个图象列表中的图标都被存储在一个屏幕设备的位图中。
通常向CImageList对象中添加图像元素的方法是:首先把图标或位图调入资源文件中,然后调用CImageList:Add方法加入到图象列表控件中,将位图装入资源导致可执行文件增大,不利于软件发行,而且只能使用资源中有限的位图,无法选取其它位图。要弥补使用资源位图的不足,就必须直接使用BMP位图文件。
使用下列代码即可实现:
HBITMAP hBitmap;
CBitmap *pBitmap;
CImageList *pImageList;
pImageList=new CImageList;
pImageList->Create (32,32,ILC_COLOR4,5,2);
pBitmap=new CBitmap;
hBitmap=(HBITMAP)LoadImage(NULL,FilePathName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);//FilePathName 是位图文件完整路径字符串
pBitmap->Attach (hBitmap);
pImageList->Add (pBitmap,RGB(0,0,0));
下面结合一个实例详细说明的用法:
例程解析:
例程基于一个对话框,单击对话框中的‘添加bmp’按钮弹出文件选择框,选择一个bmp文件,即可把选种bmp文件加入到列表控件中。在MFC中,CLIstCtrl类封装了列表控件,主要用来以各种方式显示一组数据记录供用户进行各种操作,列表中的记录可以包括多个数据项,也可以包括表示数据内容的大小图标,用来表示数据记录的各种属性,Windows资源管理器的右侧框架就是一个非常典型的列表控件。
新建MFC AppWiazrd[exe]工程,工程名称ImageListAdd......
真彩工具条的实现(2006-12-08 14:32:00)
摘要:在实现高彩色工具条之前,先研究一下普通16色的工具条的实现过程,并从中总结出改进方法。在VC的资源视图中工具条是一个资源名为IDR_MAINFRAME的Toolbar型资源,并可通过在编辑按钮上的图标来完成工具条上图标的绘制。虽然在资源视图中工具条上各按钮的图标是相互独立的,但在存储时并非像图标一样保存为ico格式文件而是以bmp位图格式保存在磁盘上的。该位图是一个由工具条上的按钮图标组成的长条型位图图像,中间没有任何缝隙,在程序运行和在资源视图对工具条进行编辑时该图像首先装载到一个图像列表中,然后工具栏根据索引依次从图像列表中将图像显示到工具条的各个按钮上。由于VC限制工具栏上的图标不能超出16色,因此不论是在资源视图直接编辑位图还是用复制粘贴等手段均无法获取超出256色的工具条(注:用复制粘贴的方法虽然在编辑视图中可以暂时显示出256色的图标,但在程序运行时仍会退化成16色)。
由于不能在资源视图中通过编辑Toolbar资源实现16色以上的图标,加之工具条在显示时有并不直接从Toolbar获取图标而是从图像列表中读取,因此可以通过其他一些图像处理软件做好类似于工具条的bmp图像(仅颜色比普通工具条bmp图像丰富,其余完全一样),并以位图的形式加入到程序资源。在使用时,先将其读取到图像列表,这样图像列表中用于显示到工具条上的图标的颜色就可以是256、24位、甚至32位色的了。由于工具条缺省时将直接加载资源名为IDR_MAINFRAME的Toolbar型资源作为图标的来源,因此还必须通过SetImageList()函数将含有高彩色工具条位图的图像列表指定为工具条的图标来源。
真彩工具条的实现
由于工具条的创建是在主框架类的OnCreate()函数中完成的,因此高彩色图像的装载和图像列表的替换工作必须也在此进行。在进行程序设计之前,需要做好各种准备工作,比如高彩色工具条位图的绘制、高彩色位图加入到资源等。绘制工具条位图时,必须控制好图像的尺寸,如需要有N个边长为 M的图标,那么需要绘制的位图尺寸为长=N*M;宽=M。真彩位图在加入到工程之后就不能再在VC的资源视图中进行编辑了。由于这个彩色位图仅起到美化界面的作用,因此具体对的事件响应等工作还要通过设置原有的Toolbar资源来完成。
准备工作就绪......