1. 一台计算机对n个数据源进行分时采集,送入主存,然后分时处理。采集数据时,最好的方案是使用什么
一台计算机对n个数据源进行分时采集,送入主存,然后分时处理。采集数据时,最好的方案是使用n个指针的n个缓冲区。
数据采集系统的基本要求是:快、准。
快,就是要能够实时采集,不丢数据。n个通道采集,在多任务环境下要做到不丢数据游渣,就只能每个通道独立缓存数据了。
准,就是采集的数据要准确无误,精度有保证。考虑到要防止多通道间的数据重叠,就只能用堆栈或多缓存方式了。
(1)程序员如何选择多任务处理扩展阅读:
指针的作用:
1、指针使程序的不同部分能够共享数据
类似于共享内存,如果将某一个数据值的地址从一个函数传递到另外一个函数,这两个函数就能使用同一数据。
2、利用指针,能在程序执行过程中预留新的内存空间
大多数情况下,可以看到程序使用的内存是通过显式声明分配给变量的内存(也就是静态内存分配)。这一点对于节省计算机内存是有帮助的,因为计算机可以提前为需要的变量分配内存。
但是在很多应用场合中,可能程序运行时不清楚到底需要多少内存,这时候可以使用指针,让程序在运行时获得新的内存空间(实际上应该就是动态内存分配),并让指针指向这一内存更为方便。
3、指针可以用来记录数据项之间的关系
在高级程序设计应用中,指针被广泛应用于碰薯构造单个数据值之笑磨者间的联系。比如,程序员通常在第一个数据的内部表示中包含指向下一个数据项的指针(实际上就是链表了),来说明这两个数据项之间有概念上的顺序关系。
2. 运维程序员如何快速处理线上问题
对于大多数运维程序员来说,时时刻刻都需要关注服务器和系统程序可能出现的问题并提前解决。今天我们就通过案例分析来了解一下,运维程序员如何快速处理线上问题。
任何一旦掉进坑里,明智的做法一定是:跳坑_>填坑_>避坑,线上故障处理的过程也一样,优先级从高到低,线上故障处理的目标如下:
跳坑
‘跳坑’——快速恢复线上服务,或者将对线上服务的影响降到低。
线上服务的可用性决定着服务者的客户利益,影响着公司的收益。一旦线上环境不可用,无法服务用户,给公司/团队带来经济利益损失的同时,更为严重的会给公司/团队带来恶劣的名声。所以一般公司都会对线上环境提出稳定性和可靠性的要求,这也是团队乃至部门的kpi。为此,遇到生产故障后的一要务是:恢复生产服务,即使不能完全恢复线上服务,也要想尽办法将对线上服务的影响降到低。
填坑
‘填坑’——找到问题原因,根本上解决问题。
在恢复线上服务,尽大限度减掉对用户/公司/团队带来的影响后,我们需要彻查问题,搞清楚故障发生的根本原因,从根本上解决问题。通常情况下,‘填坑’和‘跳坑’是同步在做的,完成‘填侍吵坑’也就意味中乎拿‘跳坑’成功,但是也有一些紧急情况下的特别‘跳坑’方法,比如重启服务,或者服务降级/熔断等等,实际并未在当时完成‘填坑’,而是先采取非常规手段‘跳坑’,之后再慢慢‘填坑’。
避坑
‘避坑’——举一反三,消灭隐患。
找到了根本原因,解决了问题之后,我们需要举一反三,以此及彼,想想在这个故障排查和处理过程中,那些环节存在弱点?那些流程/规范/制度需要优化?这类问题是否在其他系统或者团队中也存在?通过这样的反思和自我批评,形成一份线上事故报告,不断完善流程,避免再次踩坑,也在团队中交流经验,共同提高。
线上故障处理的思路
依据线上故障处理的目标及目标的优先级,线上排障的一目标是恢复线上服务或者降低对线上服务的影响,关键点在于快速二字,在‘跳坑’-‘填坑’之后,再行回溯总结,以便‘避坑’。因此,可以将线上故障处理的步骤分为:
故障发现
故障定位
故障排除
故障回溯
其中前三步是‘跳坑’行为,后面一步包含了‘填坑’和‘避坑’。
上述步骤并不是说要从上到下顺序进行,建议在不乱阵脚的情况下,并行去做,因为通常线上故障后会紧急启动故障处理程序,运维、开发、测试、产品各个角色都会参与进来,这时候分工下去,并行去做,不断汇总消息,做出判断,以求快速排障岁谈搭,恢复服务。这个思路类似于操作系统的fork/join设计思想,目的在于提高效率。
在无法快速找到故障原因的时候,需要果断跳过故障定位环节,直接进行故障排除,比如采用服务降级、服务器扩容等手段,确保对线上服务降到低且可控。北京北大青鸟建议可以等到线上服务’撑’过去之后,我们再慢慢定位故障原因,根本上解决问题。
3. Eclipse客户端程序中多线程的使用[1]
本文分析了Eclipse中多线程程序的实现 讨论了在Eclipse客户端程序开发中应用多线程的方法和要注意的问题 同时也讨论了多线程程序的一些调试和问题解决的方法
Eclipse作为一个开发平台 使用越来越广泛 基于Eclipse Rich Client Platform开发的客户端程序也越来越多 在当今越来越复杂的应用环境中 我们的客户端程序不可避免的要同时进行多任务的处理 一个优异的客户端程序都会允许用户同时启动多个任务 从而大大提高用户的工作效率以及用户体验 本文中我们来谈谈Eclipse中实现多任务的方式
在我们基于Eclipse的Java程序中 我们有很多种方式提供多任务的实现 熟悉Java的朋友立即会想到Java的Thread类 这是Java中使用最多的一个实现多任务的类 Eclipse平台为多任务处理提供了自己的API 那就是Job以及UIJob Eclipse中的Job是对Java Thread的一个封装 为我们实现多任务提供了更方便的接口 以下是Job的基本用法
清单 Job用法示例
Job job = new Job( Job Name ){protected IStatus run(IProgressMonitor monitor) {// 在这里添加你的任务代码return Status OK_STATUS;}};job schele(delayTime);在Eclipse中我们也会经常用到Display asynchExec() 和Display synchExec()来启动任务的执行 这两个方法主要为了方便我们完成界面操作的任务 以下是Display asynchExec()的用法 Display synchExec()和它类似
清单 Display synchExec()用凯纳法示例
Display getDefault() asyncExec(new Runnable() {public void run() {// 在这里添加你的任务代码}});通常 在Eclipse中我们最好使用Eclipse提供的Job接口来实现多任务 而不是使用Java的thread 为什么呢?主要有以下几个原因
Job是可重用的工作单元 一个Job我们可以很方便的让它多次执行 Job提供了方便的接口 使得我们在处理中能够很方便的与外界交流 报告当前的执行进度 Eclipse提供了相应的机制使得程序员可以方便的介入Job的调度 例如我们可以方便的实现每次只有一个同一类型的Job在运行 Eclipse缺省提供了Job管理的程序 可以查看当前所有的Job和它们的进度 也提供UI终止 暂停 继续指定的Job 使用Job可以提高程序的性能 节省线程创建和销毁的开销 Eclipse中的Job封装了线程池的实现 当我们启动一个Job时 Eclipse不会马上新建一个Thread 它会在它的线程池中寻找是否有空闲的线程 如果有空闲线程 就会直接用空闲线程运行你的Job 一个Job终止时 它所对应的线程也不会立即终止 它会被返回到线程池中以备重复利用 这样 我们可以节省创建和销毁线程的开销 下面我们从几个方面来讨论Eclipse中Job的实现和使用方面的问题
Eclipse中Job的实现
Eclipse的核心包中提供了一个JobManager类 它实现了IJobManager接口 Eclipse中Job的管理和调度都是由JobManager来实现的 JobManager维护有一个线程池 用来运行Job 当我们调用Job的schele方法后 这个Job会被JobManager首先放到一个Job运行的等待队列中去 之后 JobManager会通知线程池有新的Job加入了纤团运行等待队列 线程池会找出一个空闲的线程来运行Job 如果没有空闲线程 线程池会创建一个新的线程来运行Job 一旦Job运行完毕 运行Job的线程会返回到线程池中以备下次使用 从上面Job运行的过程我们可以看到 JobManager介入了一个Job运行的全盯竖没过程 它了解Job什么时候开始 什么时候结束 每一时候Job的运行状态 JobManager将这些Job运行的信息以接口的方式提供给用户 同时它也提供了接口让我们可以介入Job的调度等 从而我们拥有了更加强大的控制Job的能力
为了我们更方便的了解Job所处的状态 JobManager设置Job的一个状态标志位 我们可以通过Job的getState方法获得Job当前的状态值以了解其状态
NONE 当一个Job刚构造的时候 Job就会处于这种状态 当一个Job执行完毕(包括被取消)后 Job的状态也会变回这种状态 WAITING:当我们调用了Job的shele方法 JobManager会将Job放入等待运行的Job队列 这时Job的状态为WAITING RUNNING:当一个Job开始执行 Job的状态会变为RUNNING SLEEPING:当我们调用Job的sleep方法后 Job会变成这一状态 当我们调用schule方法的时候带上延时的参数 Job的状态也会转入这一状态 在这一段延时等待的时间中 Job都处于这一状态 这是一种睡眠状态 Job在这种状态中时不能马上转入运行 我们可以调用Job的wakeup方法来将Job唤醒 这样 Job又会转入WAITING状态等待运行
lishixin/Article/program/Java/gj/201311/27703
4. java程序员面试时被问到:如何在j2ee项目中处理高并发量访问 该怎么回答 请仔细看题干再回答
一般需从三点入手。
一、程序本身支持高并发。
简单来说就是要优化我们的代码。
1、避免使用错误的方式,尽量不用instanceof做条件判断,不要将数组声明为:public static final 。
2、使用java中效率高的类,比如尽量使用HashMap 和ArrayList ,除非必要,否则不推荐使用HashTable和Vector ,后者由于使用同步机制,而导致了性能的开销。
3、尽量指定类的final修饰符 带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String。为String类指定final防止了人们覆盖length()方法。另外,如果指定一个类为final,则该类所有的方法都是final。Java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关)。此举能够使性能平均提高50% 。
4、尽量重用对象,避免频繁的使用new对象。对于整个应用只需要存在一个实例的类,我们可以使用单例模式。对于工具类可以使用静态方法的方式访问。
用new关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用。但如果一个对象实现了Cloneable接口,我们可以调用它的clone()方法。clone()方法不会调用任何类构造函数。
在使用设计模式(Design Pattern)的场合,如果用Factory模式创建对象,则改用clone()方法创建新的对象实
例非常简单。例如,
Java代码收藏代码
下面是Factory模式的一个典型实现:
(){
returnnewCredit();
}
改进后的代码使用clone()方法,如下所示:
privatestaticCreditBaseCredit=newCredit();
(){
return(Credit)BaseCredit.clone();
}
上面的思路对于数组处理同样很有用。
5、特别是String 对象的使用中,出现字符串连接情况时应用StringBuffer 代替。由于系统不仅要花时间生成对象,以后可能还需花时间对这些对象进行垃圾回收和处理。因此,生成过多的对象将会给程序的性能带来很大的影响。
6、StringBuffer 的使用:StringBuffer表示了可变的、可写的字符串。
它有三个构造方法 :
StringBuffer();//默认分配16个字符的空间
StringBuffer(intsize);//分配size个字符的空间
StringBuffer(Stringstr);//分配16个字符+str.length()个字符空间
你可以通过StringBuffer的构造函数来设定它的初始化容量,这样可以明显地提升性能。这里提到的构造函数是StringBuffer(int length),length参数表示当前的StringBuffer能保持的字符数量。你也可以使用ensureCapacity(int minimumcapacity)方法在StringBuffer对象创建之后设置它的容量。首先我们看看StringBuffer的缺省行为,然 后再找出一条更好的提升性能的途径。
StringBuffer在内部维护一个字符数组,当你使用缺省的构造函数来创建StringBuffer对象的时候,因为没有设置初始化字符长度,StringBuffer的容量被初始化为16个字符,也就是说缺省容量就是16个字符。当StringBuffer达到最大容量 的时候,它会将自身容量增加到当前的2倍再加2,也就是(2*旧值+2)。如果你使用缺省值,初始化之后接着往里面追 加字符,在你追加到第16个字符的时候它会将容量增加到34(2*16+2),当追加到34个字符的时候就会将容量增加到 70(2*34+2)。无论何事只要StringBuffer到达它的最大容量它就不得不创建一个新的字符数组然后重新将旧字符和 新字符都拷贝一遍――这也太昂贵了点。所以总是给StringBuffer设置一个合理的初始化容量值是错不了的,这样会带来 立竿见影的性能增益。
StringBuffer初始化过程的调整的作用由此可见一斑。所以,使用一个合适的容量值来初始化StringBuffer永远都是一个最佳的建议。
7、尽量使用局部变量,调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。其他变量,如静态变量、实例变量等,都在堆(Heap)中创建,速度较慢。另外,依赖于具体的编译器/JVM,局部变量还可能得到进一步优化。请参见《尽可能使用堆栈变量》。
8、不要重复初始化变量 默认情况下,调用类的构造函数时, Java会把变量初始化成确定的值:所有的对象被设置成null,整数变量(byte、short、int、long)设置成0,float和double变量设置成0.0,逻辑值设置成false。当一个类从另一个类派生时,这一点尤其应该注意,因为用new关键词创建一个对象时,构造函数链中的所有构造函数都会被自动调用。
9、在JAVA + ORACLE 的应用系统开发中,java中内嵌的SQL语句尽量使用大写的形式,以减轻ORACLE解析器的解析负担。
10、Java 编程过程中,进行数据库连接、I/O流操作时务必小心,在使用完毕后,即使关闭以释放资源。因为对这些大对象的操作会造成系统大的开销,稍有不慎,会导致严重的后果。
11、由于JVM的有其自身的GC机制,不需要程序开发者的过多考虑,从一定程度上减轻了开发者负担,但同时也遗漏了隐患,过分的创建对象会消耗系统的大量内存,严重时会导致内存泄露,因此,保证过期对象的及时回收具有重要意义。JVM回收垃圾的条件是:对象不在被引用;然而,JVM的GC并非十分的机智,即使对象满足了垃圾回收的条件也不一定会被立即回收。所以,建议我们在对象使用完毕,应手动置成null。
12、在使用同步机制时,应尽量使用方法同步代替代码块同步。
13、尽量减少对变量的重复计算
例如:
for(inti=0;i<list.size;i++){
…
}
应替换为:
for(inti=0,intlen=list.size();i<len;i++){
…
}
14、尽量采用lazy loading 的策略,即在需要的时候才开始创建。
例如:
Stringstr=“aaa”;
if(i==1){
list.add(str);
}
应替换为:
if(i==1){
Stringstr=“aaa”;
list.add(str);
}
15、慎用异常
异常对性能不利。抛出异常首先要创建一个新的对象。Throwable接口的构造函数调用名为fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法检查堆栈,收集调用跟踪信息。只要有异常被抛出,VM就必须调整调用堆栈,因为在处理过程中创建了一个新的对象。 异常只能用于错误处理,不应该用来控制程序流程。
16、不要在循环中使用try...catch,应把其放置在最外层。
17、合理的使用Java类 java.util.Vector。
简单地说,一个Vector就是一个java.lang.Object实例的数组。Vector与数组相似,它的元素可以通过整数形式的索引访问。但是,Vector类型的对象在创建之后,对象的大小能够根据元素的增加或者删除而扩展、缩小。请考虑下面这个向Vector加入元素的例子:
Java代码收藏代码
Objectobj=newObject();
Vectorv=newVector(100000);
for(intI=0;
I<100000;I++){v.add(0,obj);}
5. 程序员是怎样解决问题的
程序员的五部曲:
第一、理解问题
解决问题的首要前提是客观准确地理解问题,这样我们才能抓住问题的本质,对症下药。
客观
为什么强调客观呢?在生活中,这样的情境很常见。
我们可以很客观地去评价他人,甚至是给他人给出合理的意见,但是同样的一件事情,放到我们自己身上,我们可能就会觉得束手无策。
通常情况下,我们对于自己的评价是带走自我保护心理的。
自己遇到问题,我们会下意识地弱化问题,或者情樱型绪化地来理解问题,造成问题的失真。
魔镜的故事就是一个最典型的卖颂改例子。
准确
当我们对自身的问题评价做不到客观的时候,我们往往也不会准确理解问题。
还有,准确的定义是找到问题的关键所在。这个怎么做呢?
我们仿照时中判间管理的方式。
首先对自己所要解决问题的过程做一个较为详细的记录。
坚持记录几天之后,我们需要将所有的记录结果进行汇总,分析,找出漏洞最大的地方。
那么这个洞也就是所谓的关键,我们也就可以找到解决问题的突破口。
举个例子,笔者前段时间开始用手机软件记录自己的时间花销,记录几天之后,就会发现,自己时间浪费最为严重的是娱乐。
知道了时间浪费的黑洞,那么接下来就该思考时间黑洞产生的原因了。
时间浪费的主要原因是两个
第一,目标流失
当我在网上查资料,或者用手机写作的时候,总会进入其他的浏览页面,等到自己发觉的时候,时间已经过去大半。
这个我称之为目标流失。也就是我们在网页浏览的时候已经忘记了自己最初的目的,比如说你本来想找一本书籍的txt版本,但是后来你发现自己浏览了一下午的娱乐新闻。
第二,多任务处理
这个问题我是经常遇到。比如说,我在进行日更的时候,有新同学发微信,说查一下宿舍的分配情况。
我当时的反应是火急火燎地去其刷微信,信息查询完毕之后,和分配在同一宿舍的同学聊了一下午。
最要命的是,等到你刷完屏的时候,你有很大可能会忘掉你在更这件事。
或者说你还记得,但你的精力已经消耗的差不多了,你会告诉自己,等会再更,然后你有很大的概率会断更。
找到时间黑洞形成的原因,那么就可以寻求解决措施了。
第二、计划
为自己的病症设置一个完整的疗程,根据问题出现的原因,制定每一步要采取的手段。
第三、拆解
这一步是和计划联系在一起的,只不过它的要求更加细化。
它需要我们将计划的每一步都拆解成可以执行的步骤,感兴趣的读者可以参考笔者的另外一篇文章《如何让遥不可及的梦想变得触手可及?》
第四、卡壳
可以说,我们每个人都有改变的想法,也确实有很多人尝试去做了,为什么还有那么多的放弃者。
因为在执行计划的时候,出现的变数让我们卡壳了。卡壳再正常不活了,那为什么会放弃?
答案是自我负罪感。
当我们卡壳的时候,我们大多数人会产生一种负罪感,就是觉得自己定计划的时候,详尽完备,而且自己已经坚持了这么长时间,会陷入一种自我怀疑,也就是负罪感。
解决的办法是立即采取行动,而不是描述问题本身,这也是我们解决所有问题的一个心态。
我们不要紧盯着问题本身,你理解问题的过程就是在采取行动,相反,你逢人就说,我遇到什么问题,我有多痛苦,没有任何意义。
第五、练习
其实这个步骤是对前面几步的一个综合。
这五部曲是一个闭环,是需要反复进行的,因为问题会不断出现。
回头看过去的生活,我们的历程何尝不是这样?不断遇到新问题,不断解决问题,然后获得新的体验。
想看更多文章
欢迎关注大鱼号【小妖影视】
6. 程序员怎么提高工作效率
程序员提高效率的一些建议
我是一个程序员、设计师和企业家,也是 Asana 的联合创始人。许多知名公司(如:Uber,Pinterest,Dropbox)都在使用这款提升团队生产力的软件。我在 Facebook 做开发经理时,设计过一个用于提升团队生产力的工具,Facebook 至今仍在使用该工具。
改善环境
避开所有打扰
“多任务处理”使人感到更有效率,但研究表明,它使我们变得更加低效。我们经常去查看邮件,这种频繁的打断使我们思维变得迟缓 ,我们需要花费比预期更多的时间回到原来事情上。所以当你需要集中注意力时:
将手机设置为勿扰模式。在 iPhone 上:从屏幕的底部向上滑动,然后点击月亮图标。
关掉所有与当前任务不相关的网页。
如果你的工作需要写邮件,写邮件时不要看到新邮件。在 Gmail 中的 Gmail 书签(过滤掉所有内容)可以实现这一点。
关掉计算机上的新邮件提醒。
退出聊天软件。
发现你的时间流
如果一天中你不断地被会议打断,你很难进入时间流、处理复杂任务的状态。
在日程表上标注自己有一个三个小时的“会议”,你是会议的唯一参与人员。这样同事们在安排会议时会避开这段时间,你可以在这段时间里不间断地将工作完成。
如果可以话,每周选择一天作为全公司的无会议日。在 Asana,我们设有“无会星期三”。
跟踪了解你一天中不同的活动的高效时间。在你的高效时间完成工作最难的部分。下图是我用来确定我的高效时间的方法,我的高效时间是上午 10 点到中午。相关阅读:寻找你的超人时间。
精通你使用的工具
如果你一整天都在使用电脑,每次你伸手去拿鼠标的时候,都会降低一点速度,阻碍你的时间流。你操作计算机的速度应该跟上你思维的速度。这样做你需要学习常用软件的快捷键。
每次需要使用鼠标时候,看看是否可以使用快捷键代替。通常你可以在菜单项中找到对应快捷键,或当你把你的鼠标光标放到按钮上会显示出快捷键提示。在 Mac 上:⌘ 是 Command,⌥ 是 Option,⇧ 是 Shift, ^ 是 Ctrl。
使用软件 SizeUp,可以迅速重新排列软件窗口,不需要使用鼠标。
优化思维
这方面我最喜欢的书籍之一是托尼·施瓦茨的《全心投入的威力:管理精力而非时间》。 仅仅是这本的书名就有很大启发性。
定时休息
通常我们以为,在工作上花费的时间越多,完成的任务也就越多。事实并非如此,人类不是机器,我们的大脑需要时间恢复。人类不是机器人。我们的头脑需要时间来充电。研究表明,工作 90 分钟,休息 15 分钟,有助于在更少的时间里完成更多的工作 。
冥想
照顾好自己的.身体
多喝水。 每天早上,我都会在办公桌上放 5 大杯水。我每天下班时,都已经把水喝完了。看到桌上放的这些水,会提醒我喝了多少水。
改善饮食。 碳水化合物过高的午餐会使你下午精力不足。
运动: 每周两次有氧运动可以帮助提高效率。
总之,使用的工作外的时间来修养身心,工作时会更加精力充沛。
直面困难、克服拖延
我们拖延,不是因为懒惰,而是因为任务的重要性会使我们感到焦虑。发生这种情况时,你应该做以下的事:
诚实面对你焦虑的原因。把导致焦虑的事情写下来,或者告诉你朋友。你为什么感到如此害怕?
寻找一个容易执行的下一步。
关于这方面,我写过一篇文章:《如何通过面对焦虑克服拖延》。
如果你现在没有精力去面对恐惧,那么至少做你的清单上的第二优先的事情,而不是去查看 Facebook。多产的斯坦福大学教授约翰·佩里把这种做法称为“结构化的拖延症”。在网站 StructuredProcrastination.com 上,他把自己的成功归结于这种做法。
优化流程
设定清晰的计划。许多低效源于没有分清事情的轻重缓急。你没有搞清楚哪些事情有助于实现你的目标、什么是最高优先级的事情。
在下一步计划没有完全明确,并且整个团队达成一致之前,不要开始行动。
先思考这些事情:我们的目标是什么?我们为什么想要达成该目标?达成该目标需要哪些步骤?每一个步的负责人是谁?这些步骤的顺序是怎样的?什么是所有去实现它所需的步骤?每一步骤由谁负责?这些步骤将按照什么顺序执行?
团队合作
有些人喜欢独自工作,但是,处理复杂任务时,我一般觉得困难、容易分心。
找一个愿意合作的队友。有时候,花费我两天的任务可以在 2 小时内与合适的伙伴完成。 “结对编程”是软件行业很常见,但它其实适用于任何领域。
或者,你可以进行自我对话,问问自己那些问题是重要的,然后把问题和答案写到文本编辑器或者笔记本里。我在电脑上以随意的形式写过一些长篇的对话,这些对话都是富有策略性的,有成效的。
公开声明最后期限
将同伴的压力转化为你的优势。如果一项重要任务没有固定的最后期限,我会自信地告诉别人:“我会在周五下班时送给你一份作业副本”。我不想在同事面前表现得很可笑,所以我会努力确保事情在周五完成。
使用软件来跟踪你的工作
毫无疑问,我认为 Asana 在这方面是最好的。它不仅为维护你的待办事项清单;它同时还管理整个团队的工作流程,所以你们不需要无休止的会议来保持同步。Asana 让大家在工作的地点面对面的交流,这样你就不需要一直通过电子邮件去获取信息。
花点时间反省
每一天结束用几分钟考虑一下:什么地方做的好,什么地方做的不好。你的整个工作流程是否有可以改进的地方?如果你每天都可以提升 1% 的效率,一年后你的效率将有 15 倍提升。
7. 程序员需要具备的基本技能,你都知道吗
下面是程序员所应该具备的基本职业技能:
基本技能 技能描述
阅读代码 这个技能需要程序员能够具备读懂已经存在的代码的能力,这样的能力可以让程序员分析程序的行为,了解程序,这样才能和开发团队一起工作,继承维护或是改进现有的程序。
编写程序 编写程序并不包括程序设计。不要以为编程是一件很简单的事情,很多程序员都认为编程只需要懂得程序语言的语法,并把设计实现就可以了。但是这离编写程序还远远不够,使用什么样的编码风格成为编写程序员最需要具备的基本技能。能否使用非常良好的编程风格直接决写了程序员的级别。
软件设计 这一能力直接决定了需要吏用什么样的代码技术达到怎么样的功能,而系统架构设计直接决定了软件的质量、性能和可维护性。并不是所有的程序在这一方面都非常优秀,但每个程序员都需要或多或少的明白和掌握这一基本技能。
熟悉软件工程 每个程序员都应该明白软件工程是什么东西,都应该知道,需求分析 设计,编码测试,Release和维护这几个阶段。当然,几乎所有的人都知道这些东西,但并不是每个人都很清楚这些东西。现在很多高级程序员都会混淆“需求规格说明书FS”和“概要设计HLD”。另外,程序员还需要知道一些软件开发的方法论,比如:敏捷开发或瀑布模型。
使用程序库或框架 一个程序员需要学会使用已有的代码,无论是标论的程序库,或是第三方的,还是自己公司内部的,都需要学会做。比如:C++中,需要学会使用STL,MFC,ATL,BOOST,ACE,CPPUNIT等等。使用这些东西,可以让你的工作事半功倍。
程序调试 程序调试是分析BUG和解决问题最直接的能力。没有人能够保证程序写出来不用调试就可以运行正常 也没有人可以保证程序永远不会出BUG。所以,熟练使用调试器是一个程序员需要具备的基本技能
使用IDE 学会使用IDE工具也会让你的工作事半功倍。比如,VC++,Emacs Eclipse等等,并要知道这些IDE的长处和短处。
使用版本控制 一定要学会使用版本控制工具,什么叫mainline/trunk,什么叫tag,什么叫branch,怎么做patch,怎么merge代码,怎么reverse,怎么利用版本控制工具维护不同版本的软件。这是程序员需要明的的软件配置管理中最重要的一块。
单元测试 单元测试是每个程序都需要做的。很多单元测试也是需要编码的。一定要学会在xUnit框架下进行单元测试。比如JUnit, NUnit, CppUnit等等。
重构代码 每个程序员都需要有最基本的能力去重构目前已有的代码,使代码达到最优但却不能影响任何的已有的功能。有一本书叫《软件的重构》 每个程序员都应该读一下
自动化编译 程序员需要使用一个脚本,其能自动化编程所有的工程和代码,这样整个开发团队可以不停地集成代码 自动化测试,自动化部署,以及使用一些工具进行静态代码分析或是自动化测试。
当然,还有很多的基本技术也是非常重要的,比如,与人的沟通能力,语言的表达能力,写作能力,团队协作能力,适应变化的能力,时间管理能力,多任务处理能力,自我学习能力,故障处理能力,等等,等等,这里只是列举了和技术相关的能力,这些是程序最最最基本的能力,只要是程序员就必需要有的能力。