Read this book:
Think Like a Manager: Everything They Didn't Tell You When They Promoted You (Paperback)
by Roger Fritz
Read this book:
Think Like a Manager: Everything They Didn't Tell You When They Promoted You (Paperback)
by Roger Fritz
我确实没有见过哪一种语言能像C++这样,在代码风格方面表现得如此诡谲和难以捉摸:谁也说不清C++代码究竟能衍生出多少种迥异的风格,但我知道,有许多C++初学者在面对不同风格的C++代码时,经常会误以为自己看到的是好几种完全不同的编程语言??仅此一点就足以提醒我们,研究和廓清C++语言风格的演化和发展规律已是当务之急了。
C++语言风格流变史:
详见:http://vcer.net/1181705404640.html
1. 带类的C――对C语言风格的因袭
2. I/O流――C++的新形象
3. OWL和MFC――窗口环境下的风格变异
4. 模板――现代C++风格的基础
5. ATL――COM时代的另类C++
6. 标准C++――一种全新的语言?
7. 读不懂的代码――兼容并包的语言风格
8. C++Builder――Borland的复兴之路
9. Visual C++ .NET――革命还是叛逆?
c++流派说:
1. 经典C++流:类是核心,例程多用C Runtime的,很少用模版,一般是正统教育的结果。
2. 古典C流:基本上当C用,偶尔用用对象,不使用异常,喜欢怀旧。
3. MFC流:秉承MFC的风格,主要使用MFC/ATL对象和Win32 API,不喜欢STL,用很多的宏把IDE的语法提示模块折磨到崩溃。
4. Portable流:以C Runtime和STL为主要工具,使用类和模版,不跨平台毋宁死。
5. Functional流:以模版和STL为主要武器,大量使用函数式语言的设计方法,并号称这才是真正的C++。
6. Win32流:多使用全局函数,偏爱Win32 API,但不排斥C Runtime,通常喜欢轻量级的程序,所以身材也比较苗条。
7. Java流:全面使用Java的风格,不能容许任何全局成员,但允许使用STL的集合类,写很多叫Factory的类。
8. COM流:喜欢AddRef()和Release(),大量使用接口,隐藏一切可以隐藏的东西,诵经的时候要把上帝替换成COM。
9. 戒律流:追求完美的C++程序,计较每一个const和throw(),极力避免不安全的cast,随身一定要带一本ISO C++手册。
10. 混沌流:其程序无常形,无恒道,变幻莫测,吾不知其名。
C++杂思录——风格的选择
公司一同事离职时撰文一篇,太有才了:
锦涛三年,余辞同济以游。其时,群雄外包,海内未平,或曰:汉略者,位处东海,其势壮焉,其薪高焉,不若往而投之,大业可图。余善其言,乃以孤穷身入汉略事之,历今两载有余,其间大小近十项目,或盛或衰,或荣或哀,皆犹在目,不足与外人道矣。今既辞归。乃做文志之。
GetMessage
::PeekMessage
SendMessage
PostMessage
PumpMessage
::TranslateMessage
::DispatchMessage
Pretranslatemessage
消息泵(CWinThread::PumpMessage)
消息循环,(::GetMessage,::PeekMessage),
消息映射
消息路由
消息队列:消息分为队列消息(进入线程的消息队列)和非队列消息(不进入线程的消息队列)。
#include <stdio.h>
#include "winsock2.h"
void main() {
// Initialize Winsock.
WSADATA wsaData;
int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
if ( iResult != NO_ERROR )
printf("Error at WSAStartup()\n");
// Create a socket.
SOCKET m_socket;
m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
if ( m_socket == INVALID_SOCKET ) {
printf( "Error at socket(): %ld\n", WSAGetLastError() );
WSACleanup();
return;
}
// Bind the socket.
sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr( "127.0.0.1" );
service.sin_port = htons( 27015 );
if ( bind( m_socket, (SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) {
printf( "bind() failed.\n" );
closesocket(m_socket);
return;
}
// Listen on the socket.
if ( listen( m_socket, 1 ) == SOCKET_ERROR )
printf( "Error listening on socket.\n");
// Accept connections.
SOCKET AcceptSocket;
printf( "Waiting for a client to connect...\n" );
while (1) {
AcceptSocket = SOCKET_ERROR;
while ( AcceptSocket == SOCKET_ERROR ) {
AcceptSocket = accept( m_socket, NULL, NULL );
}
printf( "Client Connected.\n");
m_socket = AcceptSocket;
break;
}
// Send and receive data.
int bytesSent;
int bytesRecv = SOCKET_ERROR;
char sendbuf[32] = "Server: Sending Data.";
char recvbuf[32] = "";
bytesRecv = recv( m_socket, recvbuf, 32, 0 );
printf( "Bytes Recv: %ld\n", bytesRecv );
bytesSent = send( m_socket, sendbuf, strlen(sendbuf), 0 );
printf( "Bytes Sent: %ld\n", bytesSent );
return;
}
#include <stdio.h>
#include "winsock2.h"
void main() {
// Initialize Winsock.
WSADATA wsaData;
int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
if ( iResult != NO_ERROR )
printf("Error at WSAStartup()\n");
// Create a socket.
SOCKET m_socket;
m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
if ( m_socket == INVALID_SOCKET ) {
printf( "Error at socket(): %ld\n", WSAGetLastError() );
WSACleanup();
return;
}
// Connect to a server.
sockaddr_in clientService;
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" );
clientService.sin_port = htons( 27015 );
if ( connect( m_socket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) {
printf( "Failed to connect.\n" );
WSACleanup();
return;
}
// Send and receive data.
int bytesSent;
int bytesRecv = SOCKET_ERROR;
char sendbuf[32] = "Client: Sending data.";
char recvbuf[32] = "";
bytesSent = send( m_socket, sendbuf, strlen(sendbuf), 0 );
printf( "Bytes Sent: %ld\n", bytesSent );
while( bytesRecv == SOCKET_ERROR ) {
bytesRecv = recv( m_socket, recvbuf, 32, 0 );
if ( bytesRecv == 0 || bytesRecv == WSAECONNRESET ) {
printf( "Connection Closed.\n");
break;
}
if (bytesRecv < 0)
return;
printf( "Bytes Recv: %ld\n", bytesRecv );
}
return;
}
A Crash Course on the Depths of Win32™ Structured Exception Handling
http://www.microsoft.com/msj/0197/exception/exception.aspx
How a C++ compiler implements exception handling
http://www.codeproject.com/cpp/exceptionhandler.asp
下午参加了部门内Team Lead的管理方面的培训,大家讨论了下理想团队的条件,列举如下:
・ 有共同目标
・ 计划
・ 执行力
・ 良好的制度
・ Open,积极的氛围
・ 公平的激励机制
・ 凝聚力
・ 信任
・ 分工明确
・ 好的领导
・ 畅通的沟通平台
・ 允许多样化
触摸技术
Microsoft Surface:http://www.microsoft.com/surface/
Autodesk touch wall: http://www.youtube.com/watch?v=ArlmuNJ2NBc
内文广告
Contera: http://www.kontera.com/default.aspx
Clickeye: http://www.clickeye.cn/
Web App
Best4c: http://best4c.cn/
3D:
SecondLife: http://secondlife.com/
3D Search engine: http://shape.cs.princeton.edu/search.html
SpaceTime: http://www.spacetime.com/
附:
未来网络发展的十大趋势
http://www.techweb.com.cn/world/2007-09-06/251639.shtml
1. 语义网络
2. 人工智能
3. 虚拟世界
4. 移动技术
5. 注意力经济
6. 作为网络服务的网站
7. 在线视频/网络电视
8. 互联网应用
9. 国际网站
10. 个性化
超简洁图片版中德文化比较:
http://msn.bbs.ynet.com/viewthread.php?tid=459060
真的非常形象 :) 毕业后进公司一直跟德国的team一起开发,跟德国人已经打了两年多的交道了,虽然多半是通过mail,AIM,telephone等形式的,但是映像还是非常强烈的。
Engineering Excellence Traning
People, process, Tools
By Raymond Zhang张银奎
CPU 的调试支持(INT1,INT 3)
软件支持调试应该由架构师通盘考虑。
Method for fixing bugs: intuition, Diagnostics, Leap of faith, Head in sand, Scientific approach.
软件断点:
Int3指令
・ 机器码为1字节,即0xCC
・ 没有数量限制
・ 局限性:
属于代码类断点,即可以让CPU执行到代码段内的某个地址时停下来,不适用于数据段和I/O空间.
对于在中执行的程序,比如或其他固件程序,无法动态增加软件断点,硬件断点。
Debug 与Release的区别之一:一个变量如果没有初始化,则在debug中编译器会初始化,而在release版中则不会被初始化(耗费时间),这也是为什么有时在deb ug中是好的而release版中出错的原因之一。
CPU的调试寄存器。
软件断点设置的是代码段的地址,硬件断点则可以是,代码段,数据段,I/O段的地址。
Exception and interuption
高级语言的Exception都来自CPU Exception,如 0 Divide-By-Zero, 1 Debug Exception, etc.比如,如果一个指针没有真正指向一个有效地址,这时往指针强行写值,CPU就会抛出Page Fault(14) exception
Best Practices:
Design code so bugs are easy to isolate:
・ Assertions
・ Tracing
・ Logging
・ Error Messages
・ IDs,在代码内部给每个错误分配一个错误ID,帮助开发人员定位源代码。
微软自带一个工具可以看window内核的tracing 信息,什么工具?
Write complete unit tests.
Set compiler to its pickiest mode.
Use tools to ensure good code coverage. i.e: Magellan from MSR.
Time spent on quality saves time later!
函数返回值都是放在Ax寄存器中。
Windows中的异常:
Win32, CLR及.Net异常(异常代码e0434f4d) ,C++(0x06d7363)
JIT调试器的设置!与Windbg或VS.net结合 cmd: windbg -i
Dr.Watson
Msdn杂志有调试专栏
《成功人士的七个习惯》
Communication:
Listenning skills:
・ Value the opinions of others
・ Be considerate, don't interrupt.
・ Non-verbal message are important also.
Asking questions:
・ Make the point.
Persuasion:
Know your audience.
Three type of people
Software Lifecycle.
Planning, definition, design, implement, test, CCB, RTM
Milestone,spec,
Feature meeting
unit test, code review.
Code complete, feature complete,
Bug tracking,Bug bush, trigle meeting(PM, Dev,QA)
Soft CCB, Hard CCB
Performance, Security in software lifecycle.
Milestone Quality(MQ), Quality gates
Priorities and Time Management.
Make decision: Pugh concept Selection process.
浪费时间: interrupt.
Suggestion:
2 tasks at a time.
Batch process.
Use Outlook's task list.
Design
Successful design strategy: simply!
Design Process: basic design, draft, iterator, UML, TDD
Design issue:
・ Performance,
・ Usability
・ Reliability
・ Internationalization
・ Localizability.
・ Security.
Design by Contract.
Design Pattern.
Prototyping.
Documentation.
TDD
Unit test.
Performance testing practices.
C++ Object model:
每个函数都会被分配一个stack。
Compiler在compile的过程中将每一个函数需要的stack空间算好了,这些信息就存在exe文件中。然后在运行时再分配空间。
对于if else这样的分支,现代编译器都会将这样的block当成一个函数,然后在Active stack中为其分配statck空间。
Stack空间是提前分配好了的,即stack是静态存储空间,在运行时已不可改变。
内存分配的两个原则: 谁new谁释放。构造函数中分配,析构函数中释放。