第一篇:程序员从编程总结的 22 个经验
以下所列是我在这些年来软件开发工作过程中受到的启发,还有总结而来的好经验。
开发
1.从小事做起,然后再扩展
无论是创建一个新的系统,还是在现有的系统中添加新的功能,我总是从一个简单到几乎没有任何所需功能的版本开始,然后再一步一步地解决问题,直到满意为止。我从来没有妄想过能够一步登天。相反,我一边开发一边学习,同时新掌握的信息还可以用于解决方案中。
我很喜欢 John Gall 的这句话:
“复杂系统总是源于简单系统的演化。”
2.一次只做一件事
当我们在开发时,碰到测试失败和功能无效的情况,如果你一次只研究一个问题,那将会更容易找到问题的关键。换言之,就是使用短迭代。必须确保这个问题解决之后,再转移到另一个问题上。这适用于向下提交。如果在你添加新功能之前需要先重构代码,那么先提交重构,然后再添加新的功能。
3.尽早地添加日志和错误处理
在开发新系统时,我做的第一件事就是添加日志和错误处理,因为这两者从一开始就非常有用。对系统来说它比一大把代码更有用,你需要一些了解程序状态的方法。如果系统不能照常工作,那么你就需要知道程序中发生了什么——这是日志的作用。错误处理也是如此——错误和异常越早处理越好。
4.每一行新代码必须至少执行一次
在你真正完成一个功能之前,你必须对它进行测试。不然,你怎么知道它是不是按照你的想法在执行呢?通常情况下,最好的方法是通过自动测试,但并非总是如此。不过,不管怎么说,每一行新代码必须至少执行一次。
一般,我们想触发某种条件很难。但幸运的是,我们可以作弊。例如,数据的错误处理可以通过临时拼写错一个列名来触发。或者,一个if语句可以暂时颠倒过来(从 if error 变成 if not error),这样来触发那些平时很难触发的条件,这样只是为了确定代码是否正常运行和它会出现什么结果。
有时,我发现有一些行代码永远都不会被运行。当我们做代码检查是它看起来没有什么问题,但就是不工作。你要避免这样的尴尬状况,如果你想你的每一行新代码都会被执行。
5.在整体测试之前先进行模块测试
先进行部分模块测试可以节省时间。通常说来,我们在整合不同的模块时也会出现问题,例如模块之间的接口不匹配。但是如果我们能够信任各个组件的话,那么跟踪集成问题就会变得简单得多。
6.所有事情所花费的时间总是比你预期的要长
特别是在编程中,即使一切进展顺利,我们也很难对功能所需的时间做出正确的预算。并且,开发软件时碰到各种意想不到的问题是非常常见的。一个简单的合并操作会导致一系列小bug,一次框架升级意味着一些函数必须改变或者一些API不按照你想象的那样工作。
Hofstadter Law(霍夫施塔特定律)其实道出了真谛:做事所花费的时间总是比你预期的要长,即使你在预期中已经考虑了 Hofstadter Law(霍夫施塔特定律)。
7.先了解现有的代码
大多数的编码都需要以某种方式改变现有的代码。即使是新功能,也需要适应现有的程序。所以,在你加进去新的内容前,首先需要了解当前的解决方案。否则,你一不小心就很有可能会打破现有的功能。这意味着,阅读代码和编写代码都是必要的技能。这也是为什么看似微小的变化仍可能需要很长时间才能解决的原因之一,因为你首先必须了解上下文。
8.阅读和运行代码
幸运的是,对于理解代码,我们有两种互补的方法。你可以阅读代码,也可以运行代码。运行代码的确是个非常棒的好方法。所以,请确保充分利用这两种方法。
故障排除
9.Bug 总是难免的
我不喜欢那些宣称软件开发可以“一蹴而就”的高谈阔论。不论你再怎么努力,bug总是难免的(BUG的定义基本上是:“我们没有想到”)。最好能够做成可以快速故障排除、修复bug和部署修复的系统。
10.解决故障报告
每个开发人员都应该花时间去处理来自客户的故障报告,并修复bug。这能让你更好地理解客户的意图,明白如何使用系统,知道排除故障的难易程度,了解系统的设计情况。这也是为自己的开发成果负责的好方法。不要错过这些好处。
11.重现问题
修复bug的第一步就是重现问题。然后你得确保修复之后,问题能够彻彻底底地消失。这样一个简单的规则,可以确保你不会误将非问题当作是问题,并确保解决方案真的能够奏效。
12.修复已知错误,然后再看看有没有其他不对的地方
有时候,可能同时存在着几个不同的问题。它们之间的互相作用,可能会让你毫无头绪,束手无策。不要纠结于搞清楚发生了什么,先去解决所有已知的问题,然后再看看还有什么不对的地方。
13.没有巧合 在测试和故障排除时,不要相信会出现什么巧合。就像你改变了定时器的值,那么就会改变系统重启的频率。所以一切都并非是巧合。添加新功能,另一个不相干的功能变慢了?这绝对不是巧合。相反,是你应该仔细调查的内容。
14.关联时间戳
在故障排除时,事件的时间戳可以作为你的好帮手。寻找偶数增量。例如,如果系统重启了,并且刚刚发出过一个3000毫秒左右的请求,那么可能是触发了某个定时器,才导致出现重启的动作。
合作
15.面对面的交流最有效
当我们需要讨论如何解决问题时,那么面对面的交流比视频、打电话和电子邮件都要好。我经常在与同事讨论完后发现一个令人兴奋的更好的方案。
16.小黄鸭调试法
遇到你绞尽脑汁也解决不了的问题时,不妨找一个同事,然后将问题解释给他们听。很多时候,当你在叙述时,即使你的同事一言不发,你可能也会突然灵光乍现找到问题的关键。听起来像魔法,但是这经常起作用。
17.问问题
阅读和运行代码往往非常有助于指出代码的目的和它的工作原理。但是如果你有机会咨询那些更为了解的人(例如原来的程序员),那么千万不要错过。继续问他们具体的问题、后续的问题,这几分钟内给你的信息可能是你需要花费好几天才能获得的。
18.共享荣誉
不要贪图荣誉,该是谁的就是谁的。例如:“Marcus 想出了这个主意……”(如果真是他想的话),而不要说“我们想出的……”。大胆的说出那些帮助过你或者贡献过力量的人的名字。
其他
19.动手去做
如果你不知道某种编程语言功能的工作原理,那么不妨写一个小程序来理解它是如何工作的。这同样适用于测试你正在开发的系统。如果我将参数设置为-1,会发生什么?当我在重启系统时,如果服务当掉,会发生什么?以此来研究它的工作原理。经常做这些会帮你发现bug,在此同时也会加深你的系统工作的了解。
20.带着问题睡觉
如果你正在解决一个很难的问题,那么不妨带着问题睡觉。有科学研究表明,这样做虽然你表明上并没有在主动思考,但你的潜意思却这么做了。其结果就是,第二天再去研究问题,解决方案已经呼之欲出了。
21.改变/跳槽
不要害怕角色变化。和不同的人共事,开发不同的产品,感受不同的公司文化是非常有意思的。在我看来,太多的人只是被动地呆在同样的地方年复一年的工作,只有在被迫的情况下才去改变。
22.活到老学到老
软件行业的一大魅力就是我们随时有机会可以学到新的东西。你可以尝试不同的编程语言和工具,阅读软件开发的书籍,接受MOOC课程。相信我,量变才能达到质的飞跃,这些小小的学习积累,终有一天会大大地提高你的知识和能力。
第二篇:编程经验
1.当性能遇到问题时,如果能在应用层进行计算和处理,那就把它从数据库层拿出来。排
序和分组就是典型的例子。在应用层做性能提升总是要比在数据库层容易的多。就像对于MySQL,sqlite更容易掌控。
2.关于并行计算,如果能避免就尽量避免。如果无法避免,记住,能力越大,责任越大。
如果有可能,尽量避免直接对线程操作。尽可能在更高的抽象层上操作。例如,在iOS中,GCD,分发和队列操作是你的好朋友。人类的大脑没有被设计成用来分析那些无穷临时状态——这是我的惨痛教训所得。
3.尽可能简化状态,尽可能局部本地化,适用至上。
4.短小可组合的方法是你的好朋友。
5.代码注释是危险的,因为它们很容易更新不及时或给人误导,但这不能成为不写注释的理由。不要注释鸡毛蒜皮的事情,但如果需要,在某些特殊地方,战略性的长篇注释是需要的。你的记忆会背叛你,也许会在明天早上,也许会在一杯咖啡后。
6.如果你认为一个用例场景也许“不会有问题吧”,它也许就是一个月后让你在发布的产品
中遭受惨痛失败的地方。做一个怀疑主义者,测试,验证。
7.有疑问时,和团队中所有相关人交流。
8.做正确的事情——你通常会知道这指的是什么。
9.你的用户并不傻,他们只是没有耐心理解你的捷径。
10.如果一个开发人员没有被安排长期的维护你们开发的系统,对他保持警惕。80%的血、汗、泪水都是在软件发布后的时间里流的——那时你会变成一个厌世者,但也是更聪明的“行家”。
11.任务清单是你的好朋友。
12.主动让你的工作更有乐趣,有时这需要你付出努力。
13.悄无声息的崩溃,我仍然会为此从噩梦中惊醒。监控,日志,警报。清楚各种的假警报
和不可避免的感觉钝化。保持你的系统对故障的敏感和及时警报。
14.复杂是大敌。
第三篇:从编程到管理——程序员的晋升之路(范文模版)
从编程到管理——程序员的晋升之路
与任何职业一样,软件开发工作同样存在着领导者与生产者的划分。具体来讲,我们要么是Steve Jobs,要么是Woz。这是两种完全不同的发展方向,但都足以将大家引导至辉煌的成功。
有才华的工程师常常会把管理技术团队作为职业生涯的下一个发展目标。因此,如果大家正在朝着这一方向进发,那么需要做出哪些转变来促成这项进展?在今天的文章中,我们会探讨一些具备可行性的方法、过程中常见的陷阱以及相关解决方案。
这里提出的第一个问题是,您是否愿意为了迈入管理层而迎接彻底的职业颠覆?您是否属于像Woz那样的技术型人才?了解自己的特性以及希望迈入怎样的管理岗位绝对是最值得大家认真反思的首要议题。
您需要考量自己对工作当中的哪个方面最感兴趣,而哪方面内容是您希望尽可能避免的,”彭博资讯公司基础应用工程技术负责人Adam Wolf指出。如果大家真正偏好的是带领团队中的每位成员共同解决问题,或者构建愿景并引导大家为之不懈努力,那么管理岗位绝对是各位冲击人生新高度的绝 佳机遇。” 全面地考量管理岗位转型
管理工作的起点就在我们当前的位置,或者说现有岗位当中。管理者需要承担更多责任,与团队中的其他成员沟通并让自己成为人们的关注焦点。通过这种方式,大家可能会建立起良好的第一印象,并引导其他成员对我们寄予更多期望,当然具体效果还不只这些。美国太平洋大学临床分析教授Rick Hutley建议称,如果打算在管理岗位上有所作为,大家不妨先看看自己的脸皮有多厚。
证明自己能够在目前的工作职责基础上建立起信任感,这代表着我们可以承担起更多责任。”--Chef公司工程技术副总裁James Casey 问问自己您能否承受得住风险以及批评,”英国电信公司前任CIO、现任思科系统公司创新事务副总裁Hutley表示。坦率地讲,当一位幸福的基层工 作者要比作个痛苦的领导者更好。也就是说,大家要积极迎接更广阔的视野。我们应该有勇气走出舒适的现状,主动承担起更多责任。”
管理他人往往也会带来诸多尴尬的状况,这种别扭的职业生涯也可能会让当事者烦恼不已。优秀的管理者应该受到自身领导他人及理解他人的渴望所驱动--一味批评虽然能够影响他人,但却无法帮我们赢得朋友。
领导地位意味着在某些场合下作出艰难的决定--包括与那些自己曾经的同事发生争执甚至冲突--而且这很可能是一条孤独的职业道路,”Hutley强调称。我们走得越高,遭遇失败的可能性也就越大--特别是在某些人看来。”
西雅图企业级软件供应商Chef公司工程技术副总裁James Casey指出,我们可以传达自身对于担当管理者的渴望--这一点非常重要--同时不失时机地展示自身成为优秀领袖的各种素质。领导与引导是这份素质清单中的核心项目--甚至足以决定一切,”Casey表示。我经常会问自己,'团队中的同事希望我统领这支队伍吗?为什么是? 又为什么不是?'在考虑如何实现晋升的过程中,大家需要首先把当前的工作做好--这表明我们能够以现有职责为基础积累起充分的信任感,这代表着我们可以承 担起更多责任。” 但如果大家此前从未有过管理经验,那么怎样确定自己擅长这方面的工作呢?Hutley就此给出了建议:您是否是那些会着眼于当前任务之外,更多关注 社交影响而非仅仅是工作本身的员工吗?您是否会提出更理想的解决方案,或者挑战存在缺陷的固有成规?其他同事是否会寻求您的想法或者指导?如果答案是肯定 的,那么您就是一位天生的领导者--而其他人也会承认这一点。”
全面地考量管理岗位转型
如果大家希望通过努力工作及对细节的专注来加快自己晋升的步伐,那么传达自己的规划将变得非常重要。向管理层的这步飞跃意味着我们的日常工作将面对全新设计。不过作为第一步,我们首先需要将自己的意图传递给顶头上司。
硅谷行政管理培训师Jennifer Selby Long在过去二十年中一直在帮助软件开发人员走上管理岗位,并指导他们更加高效地统领相关团队。Long表示,出色的工作成果尚不足以发出强烈的信号--我们还需要做得更多、想得更远。而这绝不像表面上看起来那么简单。
寻找规模扩展速度最快的业务,因为这些领域将提供大量机会、帮助各位站出来承担本职工作之外的责任。”
--Lever公司联合创始人兼CEO Sarah Nahm 几乎每一位软件工程师都希望继续自己的软件开发之路,因为除非我们坦率表达自己的愿望,否则顶头上司根本意识不到我们涉足管理工作的意向,”Long指出。积极讨论自己为企业做出更多贡献的愿望,并乐于接受新的挑战,而不能单纯将着眼点放在自己的现有职业发展路线之上。”
业绩审查与其它一对一面谈正是我们表达迈入管理层的最佳时机。而且大家的顶头上司也许正好有能力帮助各位了解需要充实自己的哪些技能储备来实现晋升理想,Chef公司工程技术副总裁Casey解释道。
无论所在企业使用哪种系统来记录大家的职业抱负与发展方向,与顶头上司之间的一对一谈话都是从细节入手探讨晋升目标的最佳时机,”Casey补充 称。如果大家和自己的顶头上司都看好同一条管理职责拓展途径,那么对方将成为我们最大的导师兼敦促者,而这也是实现成功的理想方式。” 除了上述提示之外,如果大家希望从当下开始采取措施,那么这种微妙但又艰难的变化可能会给我们的日常办公流程带来影响。这显然是种个人选择,而且除了Mark Zuckerberg,其他管理者必须得放弃个人购物时间来主持业务例会。我曾经得到过的最好的建议是:'如果你打算拿下某个岗位--首先要让自己看起来像是拥有该岗位的人员,'”Hutley表示。当一家企业打算为某个 职位寻找人选时,他们会首先梳理心理关系网、搜索那些看起来像是能够用途该工作的人员。在招聘广告登出之后才开始行动已然为时太晚,我们需要在此之前就在 行动上表现出自己对该岗位当仁不让的决心。” 而这种微妙的转变--以及让自己脱颖而出的过程--往往会在当前工作环境中引发摩擦。
作为一名管理者,我们的工作当中约有九成的内容是对他人造成影响,而这是一项与逻辑无关的任务。”
--行政管理培训师Jennifer Selby Long 以潜在管理者的形象出现本身可能会产生一些不便。穿着整洁的下装与干净的衬衫显然会让大家在充斥着牛仔裤与运动鞋搭配的办公室里看起来有些格格不 入,”Hutley指出。如果如果始终以基层员工的面貌出现,大家永远无法顺利实现晋升--您必须以自己的方式达成鹤立鸡群的效果,包括言谈与行为。” 尽可能借力于一切因素
当然,大家可以申请MBA学位并通过在线或者在职方式完成相关课业。专业人士指出,公开演讲课程能够帮助我们逐步熟悉预算培训、自我评估,并掌握多样性及包容性的相关内容。但在办公室当中,我们同时拥有大量足以帮助自身向正确方向迈进的机会。
我其实应该以自己没有MBA学位为理由否定上述观点,”彭博资讯公司的Wolf指出。在我看来,我在成为管理者之后通过实践学到了更多,而并非以管 理角色作为着眼点进行系统培训。我确实接受过与管理相关的课程并读过不少书籍,但我发现帮助最大的还是来自同事、管理者以及整个团队的反馈意见,我也通过 审视角色模型并了解其为何能够确切起效而得到了切实助益。”
积极寻找导师,”Hutley表示赞同。所谓导师并不一定非要以正式角度委任--当然,专业导师也很不错。找到能够与自己产生共鸣的领导者--从对 方身上学习自己欣赏且希望拥有的宝贵品质。接下来,在理解了自己钦佩对方的理由后认真进行观察:他们在面对特定情况时会如何处理,他们如何着装、交流及行 动等等。”
在相关领域获取资质认证也能够表明我们希望晋升的意愿,招聘服务企业HireStrategy公司常务董事Eric Klein指出。而且大家可以通过帮助新人或者大学毕业生的方式展示自己的领导才能。
大家必须适应立足于幕后审视团队当前工作成果的感觉。”--彭博资讯公司基础应用工程技术负责人Adam Wolf 当某位同事在开发工作中陷入困境时,不妨从同事的角度帮助其进行代码审查,”Klein指出。除了管理项目与统领团队,指导新人员工与同行也能够证明我们有能力承担起领导任务。” 谷歌公司前Chrome开发团队成员Sarah Nahm给出的建议是,我们应当从目前增长速度最快的业务领域处寻找机会。
工程师应当关注身边的业务发展趋势,”Nahm指出,目前她领导着Lever公司--一家专门帮助企业随业务扩展招聘员工的硅谷企业。寻找规模扩展 速度最快的业务,因为这些领域将提供大量机会、帮助各位站出来承担本职工作之外的责任。以志愿者角色参与到更多面试中来,并在战略决策的制定会议中坐在前 排。如此一来,大家将更为明确地了解到哪些元素会给工程技术组织带来深远影响,同时为未来统领团队并需要雇用更多工程技术人员的情况储备关键性技能。” 作出转变
一位专家指出,管理岗位会给从业者带来大量同样的挑战与不确定因素。他随后补充称,我们绝对不能采取直白的表达方式--否则必然招致被整个团队所疏远的风险。有鉴于此,类比与提醒才是最理想的沟通手段,而这正是作为职业转变的基础性蓝图。
首先,做好准备迎接全面且彻底的职业生涯转变,”行政管理培训师Long表示。在人力方面,我们没有产品规范或者算法可供参考。作为管理者,大家的 工作有九成内容都是在影响他人,而这显然是一项与逻辑无关的任务。另外我们还需要处理带有模糊属性的业务并通过他人产生结果,而这项工作也无法单靠逻辑以 及理由来实现。” 接下来才是真正困难的部分。大家准备好接过控制权,并保证整个团队继续顺利完成既定工作目标了吗?
在技术这个只问'你最近为我做了什么'的残酷行业当中,大家的通行证……就是自己的技能储备。如果失去了这一点,我们的立足根基也将分崩离析。”--WinterWyman公司首席顾问Mark Stagno 只有最糟糕的管理者才会过分施加控制,”Long指出。但这些事必躬亲的领导总以为自己是在做正确的事。您能将自己的全部精力用于指导、支持、点拨以及鼓励他人吗?这种心态是最基本的前提。总之,请确保自己做好了登上这辆过山车的全部心理准备。” 另外,如果团队当中存在着来自原本工作组的同事,您会如何处理与这些同事之间的工作关系?
大家必须保持理想的客观心态,并以坦诚的方式传达令人较难接受的决定,”Hutley指出。如实传达这种负面反馈确实非常困难--而且双方都会因此而饱受折磨,而不仅仅是管理者一方。也就是说,大家用不着刻意回避自己的这些老战友。” 引导团队成员拓展自己的技能,各位专业人士一致指出,同时准备好在遭遇失败时经受应有的教训。再次强调,这些技能--包括高效沟通、增强说服力以及在面对不确定因素时保持冷静--往往并非天生就能具备,不过我们可以通过学习来获取。
领导者要做的就是引导与培训,然后让下属们去自由发挥,”Hutley表示。当事情按既定计划发展时,我们需要及时作出表扬和鼓励;但当情况出错时--我们难免要忙中出错--时表达支持与理解。”
彭博资讯公司的Wolf表示认同,并建议新任管理者能为所统领的团队提供与以往一样的自主发挥权利。
大家不要因为好高骛远而放弃责任,”Wolf指出。大家必须适应立足于幕后审视团队当前工作成果的感觉。我发现将重点放在向团队提出确切相关的问题并敦促其找出正确答案方面能够带来良好的收效。”
另外,不要放弃长久以来推动我们获得领导岗位的固有特质。换言之,被收回职权的最快方式就是遗忘了自己引以为傲的技能储备。
使用主流技术方案能够保证我们在离开一家企业后,迅速在其它业务环境中上手工作,”职业介绍企业WinterWyman公司首席顾问Mark Stagno表示。在技术这个只问'你最近为我做了什么'的残酷行业当中,大家的通行证……就是自己的技能储备。如果失去了这一点,我们的立足根基也将分 崩离析。而且如果情况发生转变--公司处境较为艰难或者工作得不太顺心--如果没有拿得出手的技能亮点,大家将很难找到新工作。” 关于是否继续关注原有专业的争论 我们还认为,成功实现晋升后的工程技术人员不妨偶尔回顾过往,审视将代码构建与部署作为核心工作--而非管理产品、预算与团队--的那段时光。HireStrategy公司的Klein表示,他有时候会听到那些由工程师晋升为管理者的同事抱怨他们错过了大量编程工作。随着技术的不断变化与 发展,管理者们同样需要关注自己的技术性技能,甚至可以将其作为管理技能的一部分纳入提升议程,”Klein指出。我们会提醒指出,当职业生涯走向终点 时,每个人都会找到其中最令自己振奋的部分。单纯从技术入手仍然可以让职业经历变得丰富多彩,而不一定非要执着于踏入管理领域。”
作为一位管理者,大家的职责将较少专注于工作,而更多集中在帮助他人获得成功上。”--Geneca公司首席架构师Michael de Groot 很多工程师都喜欢以独立方式解决问题,软件产品开发商Geneca公司首席架构师Michael de Groot指出,并以自豪的情绪拿出自己的全新解决方案。
作为一位管理者,大家的职责将较少专注于工作,而更多集中在帮助他人获得成功上,”de Groot表示。大家必须处理他人的行为、态度--以及工作偷方面的差异。” 下面来看最后一项与晋升相关的议题。当明星开发人员难于寻觅时,转型当老板也不一定主能带来更好的收益。时至今日,我们已经不可能再像Woz当年那 样环顾身处惠普且忙于制造计算器产品的同事而认定自己找到了值得为之奋斗终生的事业。在如今的市场上,那些能够实现创新的员工都是要开出大价钱的。
高端市场上的工程师其实很少有转型涉足管理岗位的,”WinterWyman公司的Stagno指出。因此在选择新的发展方向之前,请多花点时间认 真考量一番。参考以上各项意见,确定自己拥有转变方向的正当理由--换言之,证明自己确实想成为一位领导者,而不仅仅是希望靠这种方式实现职级晋升。”
原文标题:The programmer's guide to peaking into management 【编辑推荐】
程序员学习编程需要攻克的8个障碍
全球最受欢迎的计算机编程语言
如何在编程生涯中有一个好的开端
我2年学习编程的经验总结
白板编程浅谈——Why, What, How
程序员获取新编程技能必备这些技巧
第四篇:编程规范(程序员必看)
编程规范(程序员必看)
作者:
评价:
上站日期:
内容说明:
来源:
.基本要求
1.1 程序结构清析,简单易懂,单个函数的程序行数不得超过100行。1.2 打算干什么,要简单,直接了当,代码精简,避免垃圾程序。1.3 尽量使用标准库函数和公共函数。
1.4 不要随意定义全局变量,尽量使用局部变量。1.5 使用括号以避免二义性。
2.可读性要求
2.1 可读性第一,效率第二。2.2 保持注释与代码完全一致。
2.3 每个源程序文件,都有文件头说明,说明规格见规范。2.4 每个函数,都有函数头说明,说明规格见规范。
2.5 主要变量(结构、联合、类或对象)定义或引用时,注释能反映其含义。2.7 常量定义(DEFINE)有相应说明。2.8 处理过程的每个阶段都有相关注释说明。2.9 在典型算法前都有注释。
2.10 利用缩进来显示程序的逻辑结构,缩进量一致并以Tab键为单位,定义Tab为 6个字节。
2.11 循环、分支层次不要超过五层。
2.12 注释可以与语句在同一行,也可以在上行。2.13 空行和空白字符也是一种特殊注释。2.14 一目了然的语句不加注释。
2.15 注释的作用范围可以为:定义、引用、条件分支以及一段代码。2.16 注释行数(不包括程序头和函数头说明部份)应占总行数的 1/5 到 1/3。
3.结构化要求
3.1 禁止出现两条等价的支路。3.2 禁止GOTO语句。
3.3 用 IF 语句来强调只执行两组语句中的一组。禁止 ELSE GOTO 和 ELSE RETURN。3.4 用 CASE 实现多路分支。3.5 避免从循环引出多个出口。3.6 函数只有一个出口。3.7 不使用条件赋值语句。3.8 避免不必要的分支。
3.9 不要轻易用条件分支去替换逻辑表达式。
4.正确性与容错性要求
4.1 程序首先是正确,其次是优美
4.2 无法证明你的程序没有错误,因此在编写完一段程序后,应先回头检查。4.3 改一个错误时可能产生新的错误,因此在修改前首先考虑对其它程序的影响。4.4 所有变量在调用前必须被初始化。4.5 对所有的用户输入,必须进行合法性检查。4.6 不要比较浮点数的相等,如: 10.0 * 0.1 == 1.0,不可靠
4.7 程序与环境或状态发生关系时,必须主动去处理发生的意外事件,如文件能否 逻辑锁定、打印机是否联机等。
4.8 单元测试也是编程的一部份,提交联调测试的程序必须通过单元测试。
5.可重用性要求
5.1 重复使用的完成相对独立功能的算法或代码应抽象为公共控件或类。5.2 公共控件或类应考虑OO思想,减少外界联系,考虑独立性或封装性。5.3 公共控件或类应建立使用模板。
附:C++ 编程规范,delphi作相应的参考
.1适用范围
本标准适用于利用Visul C++ ,Borland C++进行软件程序开发的人员.。
.2变量命名
命名必须具有一定的实际意义,形式为xAbcFgh,x由变量类型确定,Abc、Fgh表示连续意 义字符串,如果连续意义字符串仅两个,可都大写.如OK.具体例程:
BOOL类型
bEnable;
ch
*
char
chText c
*
类对象
cMain(对象实例)h
*
Handle(句柄)
hWnd i
*
int n
*
无符号整型 p
*
指针 sz,str *
字符串 w
WORD x,y
坐标
Char或者TCHAR类型
与Windows API有直接联系的用szAppName[10]形式否则用
FileName[10]形式,单个字符也可用小写字母表示;
Int类型
nCmdShow;
LONG类型
lParam;UINT类型
uNotify;
DWORD类型
dwStart;
PSTR类型
pszTip;
LPSTR类型
LPTSTR类型
LPVOID类型
WPARAM类型
LPARAM类型
HWND类型
HDC类型
HINSTANCE类型
HANDLE类型
HICON类型
int
float
DWORD
lpszClassName;lpReserved wParam, lParam hDlg;hDC;hInstance hInstance, hIcon;iTmp fTmp dw* 4
lpCmdLine
String , AnsiString
str *
m_
类成员变量
m_nVal, m_bFlag g_
全局变量
g_nMsg, g_bFlag
局部变量中可采用如下几个通用变量:nTemp,nResult,I,J(一般用于循环变量)。
其他资源句柄同上
.3常量命名和宏定义
常量和宏定义必须具有一定的实际意义;
常量和宏定义在#include和函数定义之间;
常量和宏定义必须全部以大写字母来撰写,中间可根据意义的连续性用下划线连接,每一 条定义的右侧必须有一简单的注释,说明其作用;
资源名字定义格式:
菜单:IDM_XX或者CM_XX
位图:IDB_XX
对话框:IDD_XX
字符串:IDS_XX
DLGINIT:DIALOG_XX
ICON:IDR_XX
.4函数命名 函数原型说明包括引用外来函数及内部函数,外部引用必须在右侧注明函数来源: 模 块名及文件名, 如是内部函数,只要注释其定义文件名;
第一个字母必须使用大写字母,要求用大小写字母组合规范函数命名,必要时可用下划线 间隔,示例如下:
void UpdateDB_Tfgd(TRACK_NAME);
//Module Name :r01/sdw.c
void PrintTrackData(TRACK_NAME);//Module Name :r04/tern.c
void ImportantPoint(void);
//Module Name :r01/sdw.c
void ShowChar(int , int , chtype);
//Local Module
void ScrollUp_V(int , int);
//Local Module
.5结构体命名
结构体类型命名必须全部用大写字母,原则上前面以下划线开始;结构体变量命名必须用 大小写字母组合,第一个字母必须使用大写字母,必要时可用下划线间隔。对于私有数 据区,必须注明其所属的进程。全局数据定义只需注意其用途。
示例如下:
typedef struct
{
char
szProductName[20];
char
szAuthor[20];
char
szReleaseDate[16];
char
szVersion[10];
unsigned long
MaxTables;
unsigned long
UsedTables;
}DBS_DATABASE;
DBS_DATABASE GdataBase;
控件的命名: 用小写前缀表示类别
用小写前缀表示类别: fm
窗口 cmd
按钮
cob
combo,下拉式列表框 txt
文本输入框 lab
labal,标签 img
image,图象 pic
picture grd
Grid,网格 scr
滚动条 lst
列表框 frm
fram
7注释
原则上注释要求使用中文;
文件开始注释内容包括:公司名称、版权、作者名称、时间、模块用途、背景介绍等,复 杂的算法需要加上流程说明;
函数注释包括:输入、输出、函数描述、流程处理、全局变量、调用样例等,复杂的函数 需要加上变量用途说明;
程序中注释包括:修改时间和作者、方便理解的注释等;
引用一: 文件开头的注释模板
/******************************************************************
** 文件名:
** Copyright(c)1998-1999 *********公司技术开发部
** 创建人:
** 日 期:
** 修改人:
** 日 期:
** 描 述: ** ** 版 本:
**---------------
******************************************************************/
引用二: 函数开头的注释模板
/*****************************************************************
** 函数名:
** 输 入: a,b,c
**
a---
**
b---
**
c---
** 输 出: x---
**
x 为 1, 表示...**
x 为 0, 表示...** 功能描述:
** 全局变量:
** 调用模块:
** 作 者:
** 日 期:
** 修 改:
** 日 期: ** 版本
****************************************************************/
引用三: 程序中的注释模板
/*---------------------------*/
/* 注释内容
*/
/*---------------------------*/ 8 程序
a.程序编码力求简洁,结构清晰,避免太多的分支结构及太过于技巧性的程序,尽量不采用递归模式。
b.编写程序时,亦必须想好测试的方法,换句话说,”单元测试” 的测试方案应 在程序编写时一并拟好。
c.注释一定要与程序一致。
d.版本封存以后的修改一定要将老语句用/* */ 封闭,不能自行删除或修改,并要 在文件及函数的修改记录中加以记录。
e.程序中每个block 的开头 ”{“ 及 ”}” 必须对齐,嵌套的block 每进一套,缩进一个tab,TAB 为4个空格,block类型包括if、for、while、do等关键字引出的。
f.对于比较大的函数,每个block 和特殊的函数调用,都必须注明其功能,举例如下
:
count.divisor = 1193280 / freq;
// compute the proper count
OutByte((unsigned short)67,(unsigned char)182);// tell 8253 that a count is coming
OutByte((unsigned short)66, count.c[0]);
// send low-order byte
OutByte((unsigned short)66, count.c[1]);
// send high-order byte
×××××××××××××××××××××××××××××××××××××××
bcb,delphi中的变量命名:
遵循匈牙利命名法,命 名必须有意义,制定如下规定
窗体: 以大写的W开始,如About版权窗体,命名为WAbout
文件:以大写的F开始,如About版权窗体,文件命名为FAbout.cpp
按钮(Button):如退出按钮,命名为btnExit ……
基类: 加base标记,如报表基类,窗体命名为:WBaseRep, 文件命名为FBaseRep.cpp
第五篇:ASP+SQLServer2000编程经验积累总结
ASP+SQLServer2000编程经验积累总结
http://www.xiexiebang.com 更新日期:2007-04-21 22:13 出处:网页教学网 作者: 收藏本文
前几天帮人调试一个ASP+SQL2000+IIS5.1/6.0的网站程序,调试过程中遇到的问题如下:
一、SQLServer登录
原先存在备份数据库,通过附加数据库导入到SQL Server,原网站数据库不能正常登陆。并且已在安全中添加用户角色。赋予管理员权限以及数据库所有者权限。发现角色添加有问题,检查原因,原导入数据库中包含一个用户角色,去掉后再添加即可。
尝试登陆,仍然报错:未与信任的SQL连接。选择属性—〉安全性,修改身份验证为:windows和SQL Server。或修改注册表:
HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSSQLServerMSSQLServerLoginMode的值决定了SQL Server将采取何种身份验证模式。
1、表示使用“Windows 身份验证”模式
2、表示使用混合模式(Windows 身份验证和 SQL Server 身份验证).后正常登陆。
二、IIS5的http 500内部服务器错误
主要错误表现就是asp程序不能浏览但html静态网页不受影响,查询网络属于“IWAM账号在ActiveDirectory、IIS metabase数据库和COM+应用程序三处的密码无法同步”问题,解决方法参考网络尝试(括号内为尝试结果和处理):
手动修改:(我按照步骤但是手动修改并没有成功,郁闷)
1、重新设置IIS的IWAM账号密码。右键单击 我的电脑->管理,打开计算机管理界面打开 本地用户和组->用户 右键单击 启动IIS进程帐号 IWAM_****(注:****一般是计算机名)点击设置密码,设置为一个你想要的密码。
2、同步IIS metabase中IWAM_MYSERVER的密码,在CMD中:c:inetpubadminscripts>adsutil set w3svc/wamuserpass “yourpassword”也可:选择“站点 属性”->目录安全性标签->编辑“匿名访问和验证控制”->在弹出的框中选中匿名访问,单击编辑按钮->用户名浏览,选择IWAM_MACHINE,密码框中输入同一的密码,选中“允许IIS控制密码”->确定。
注意:
在WIN2000中,查看到的密码为星号,若要不为星号,必须要先修改adsutil.vbs文件。
a.到c盘 inetpubadminscripts找到adsutil.vbs(根据装系统时设定的不同,有的路径可能不一样)
b.右键单击,用记事本打开
c.查找 IsSecureProperty = True注意=前后各有一个空格
d.将 IsSecureProperty = True 改为 IsSecureProperty = False 获取 IWAM 帐户密码命令: cscript.exe adsutil.vbs get w3svc/wamuserpass 获取 IUSR 帐户密码命令: cscript.exe adsutil.vbs get w3svc/anonymoususerpass
输入以上命令,按回车可分别查看IWAM和IUSR的密码。
修改密码命令:
修改 IWAM 帐户密码 cscript.exe adsutil.vbs set w3svc/wamuserpass “password” 修改 IUSR 帐户密码 cscript.exe adsutil.vbs set w3svc/anonymoususerpass “password”
password 设置为你想修改的密码,即与第一步中你设置的用户IWAM_****的相同,按回车即可修改完成。
修改密码前请一定停止所有的Internet信息服务,否则后面可能会出错,并且IWAM帐户可能会被锁定。
3、同步COM+应用程序所用的IWAM_MYSERVER密码,在CMD中:
c:inetpubadminscripts>cscript synciwam.vbs –v。不成功。也可:
(1)启动组件服务管理单元: “运行”->“mmc”,启动管理控制台,打开“添加/删除管理单元”对话框,将“组件服务”管理单元添加上。
(2)找到“组件服务”->“计算机”->“我的电脑”->“com+应用程序”->“out-of-process pooled applications”,右击“out-of-process pooled applications”->“属性”。
(3)切换到“out-of-process pooled applications”属性对话框的“标识”选项卡。选择“此用户”,浏览,选择用户名“IWAM_MACHINE”。这些都是缺省的。在下面的“密码”和“确认密码”文本框内输入正确的密码,确定退出。
(4)系统如果提示“应用程序被一个以上的外部产品创建。你确定要被这些产品支持吗?”时确定即可。
(5)如果在iis中将其它一些web的“应用程序保护”设置为“高(独立的)”,那么这个web所使用的com+应用程序的iwam账号密码也需要同步。
但是在进行第三步操作时总是报8004e00f错误。进入组件服务,查看组件服务/计算机/我的电脑/COM+应用程序,结果报错“COM+ 无法与 Microsoft 分布式事务协调程序交谈”,无法查看里面的对象。在事件查看器中msdtc服务没有正常启动。解决方法:运行 msdtc-resetlog 最后解决:“COM+ 无法与 Microsoft 分布式事务协调程序交谈”在安装了Windows组件中的消息队列后,就不会出现这个错误了,同时“消息队列”组件又对服务中的“Distributed Transaction Coordinator”(即msdtc服务)有依存关系,这个服务必须启用,才可以安装消息队列组件!消息队列装好后,COM+应用程序菜单就可以打开了,表示其已正常工作!如果在这个时候再装IIS或者把IIS卸载重装,就正常了!实际上,手工同步密码太过麻烦,成功率不高!
三、数据库中的存储内容在ASP页面不解析
问题表现:网页原来使用正常,但是在使用了一段时间之后很多内容不能正常显示。
问题分析:开始以为是连接池问题,后来发现没什么关系,在页面上察看源码已经将数据库中的内容读了出来,却没有在页面上展现。发现是出现了"\"符号。这个符号在ASP中被认为是转义字符的特殊字符,无法解析,故无法正常显示。