当前位置: 首页 > news >正文

谈谈一个程序员的职场心得(真有用)

谈谈一个程序员的职场心得

  • 我会分为三个部分:软件开发,职场协作和认知成长,每个部分精简成 7 条心得。

软件开发

若无必要,勿增实体。

  • 这是奥卡姆剃刀的定义,所谓剃刀就是法则,是奥卡姆这个英国学者提出来的。这个剃刀核心的点在于不要浪费较多东西去做,用较少的东西同样可以做好的事情。放在软件领域,就是不要过度设计,添加当前不需要的功能,也不要一开始就做的非常复杂,难以维护。

  • 不需要用设计模式,就不用硬套。不需要用额外功能,就不要写扩展。用设计模式和写功能扩展,必须要有不得不这么做的理由。

  • 无论是新创建的软件系统,还是添加功能到现有系统中,都应该从一个最简单的版本开始,这个最简版本甚至几乎没有可用功能。然后,再一步步迭代与重构,扩展它的功能,完善它的设计。简单的系统自然而然会演变成复杂的系统,而不是人工注入复杂,影响它的正常进化。

日志记录,错误处理。

  • 开发新系统必须要做的一件事就是搭建日志记录和错误处理能力,系统上增加功能也要接入日志记录和错误处理。虽然这不会影响正常场景的功能,但是非常重要。

  • 日志和错误可以告诉我们程序运行的时候发生了什么,程序有没有按照预期工作,通过日志和错误我们可以基本知道程序运行的路径,也可以用来做监控,统计和预警。

每行新代码都要能被执行到。

  • 新写一个功能,一定要保证你的新代码都能被执行到,也就是你的测试用例能够覆盖到代码的每一行。有些特别的分支可能很难走到,但你要想办法走到,比如构造符合该分支的请求入参,再比如异常分支可以使用 mock 工具 mock 异常出来做触发。

一次只改一个地方。

  • 这是种变量思维。在你开发时,发现程序挂了,如果你只改一个地方,很容易定位到问题所在,因为就一个变量,不可能是别的原因了,但如果你改了好几个地方,之前也没有测试,找出原因就会花费你大量的时间和精力。

  • 所以,要小迭代,每迭代一个点确保功能符合预期,再进入下一个迭代,如此重复,而不是一股脑改掉所有的内容。

集成测试前要单元测试。

  • 你负责一个单元,你的同事负责另外一个单元,入口侧集成了这两个单元,入口有专门的测试同学来测,以验证整体功能的正确性。如果单元测试充分,就能使测试同学只关注各个单元之间协调的正确性,从而节省整体的时间和复杂度。

开发时间往往比预期长。

  • 有时候,你可能会把事情想简单,真正写代码的时候才会发现评估有遗漏,工期会比预期长。

  • 有时候,代码写的非常顺利,测试的时候可能就会被某个不符合预期的场景卡主,需要花很长的时间解决。

  • 有时候,你依赖的下游未能按期向你交付服务,你的开发工作就要延期。

  • 写代码容易,让代码正常无误的跑起来,就比较费劲了,所以评估工作量要给自己留点 buffer(缓冲),以应对一些特殊情况。

读代码并且跑代码。

  • 对于一段代码,想要理解它做了什么事情。一种方法是阅读它,凭借自己的大脑去得出代码运行的逻辑。

  • 但这种方式并不可靠,毕竟人往往是靠不住的,不过系统是可以靠得住的。

  • 那我们就可以跑这段代码,去分析真实系统环境运行的结果。

职场协作

  • 作为职场人,我的工作除了写代码,还有就是和各个角色的协作,像产品经理,项目经理,其他开发,测试,以下是职场协作方面的 7 条心得:

选择适当的沟通方式。

  • 就沟通效率而言,当面>视频>电话>聊天软件>邮件。

  • 打扰强度和正式程度是反方向。

  • 紧急的问题就当面或视频或电话,抢夺对方的注意力,尽快解决。

  • 重要的结论一定要落在聊天软件或邮件里。毕竟电话没有存档,出了问题没法追溯。

  • 但如果你什么小事都要发邮件,那也太浪费自己时间了,什么事情都要给人打电话,那也容易让别人厌烦。

  • 所以大多数场景,还是聊天软件,你留言,对方看到了再回复,不必把双方的沟通绑定在同一时间段。

借助身边人的力量。

  • 有些时候,你做事情可能会卡主,这非常困扰你,而你也毫无头绪。

  • 这个时候你就可以借助下身边人的力量了。

  • 比如一件事你在三个方案里面纠结,你就可以整理好自己的思路,分析各个方案的优劣,然后带着这些信息和同事或老板沟通,寻求他们的建议。

  • 有时候,你在向他们表达的时候,可能就意识到自己的方向了。当然,你也可以得到不同视角的建议,这对你方案的完善是很有帮助的。

  • 所谓:好风凭借力,送我上青云

善于提问。

  • 很多事情自己是可以搞定,比如读代码和运行代码可以理解这一块逻辑,但这要花很多时间。如果你直接问作者,几分钟内你就可以拿到这些信息。

  • 信息是可以换能量的。所以多提问,多获取信息,你可以少做很多无谓的工作,从而把精力投身到重要的事情上。

不轻易承诺。

  • 承诺并能顺利完成事情,是值得佩服的。

  • 过分过早承诺不适合自己做的事情,对自己无疑是一个负担。如果你本身带团队,对团队也是个负担。

  • 承诺要慎重,如果还不明朗,就带回去再评估考虑下。对外部团队如此,对团队同事也应该如此。

  • 不要给了对方期待,又给对方失望,弄得自己信用也不佳。

分享利益。

  • 一件事,如果有他人的贡献,我们要感激这个人,也要分享利益给他。

  • 比如你写的专利里某个人帮助了你,作者中一定要加入他的名字。

  • 比如你在向领导汇报你主导的项目的时候,一定要提到其他参与者的名字。

  • 《史记》里记载了这样一件事情。汉朝开国皇帝刘邦问从项羽阵营投过来的陈平:“我和项王有何区别?”

  • 陈平答道:“项王宽和,您粗野傲慢”。刘邦又问:“那你为何弃项王而投我呢?”

  • 陈平讲:“项王对于有功之人,舍不得封赏,而大王您不吝恩赐”。

  • 这个故事说明,再好的人,如果舍不得分享利益,大家就会离他而去

  • 之前看周杰伦演唱会录影带的时候,有一段是杰伦专门介绍场上乐队各个成员的名字,当时看这段挺动容的,怪不得像方文山,杨瑞代这些人能和杰伦合作 20 多年。

清楚自己的角色,做角色份内的事情。

  • 一张地图上,首先要有定位,然后要有目标,才能去看走什么样的路径。

  • 角色就是这样的定位。你把自己的角色定位成纯开发,一般来讲专注技术就好了。

  • 但如果你想和产品经理更好的沟通,最好还是培养一些产品思维。这样有个好处,就是一些技术类需求,你可以自己判定和定义了,此时你的角色就转换成产品经理了。

  • 如果需求比较多,不能马上都做,需要排下期,周期长的项目还要管理下项目节奏,此时也没有专职的项目经理介入,那你就可以尝试做项目经理的角色。

  • 你技术一路发展,对自己负责的领域了如指掌,你开始接触了一些架构设计和决策的工作,那此时已经有新角色了,就是架构师的角色。

  • 所以一个人是可以有多种角色的,角色决定了职责,因此一件事情中,要清楚自己的角色,做好角色份内的事情,不要越界,也不要失职。

让子弹飞一会儿。

  • 如果一件事存在争议,你并不是争议双方的领头人,只是这件事可能会涉及到你落地。那么不要急着去介入具体方案和落地,让他们再争会儿,很可能最终的结论是你啥也不用做。

认知成长

  • 作为终身学习者,职场工作的同时,也关心着自己的成长,以上更多是技能方面的,以下是认知成长方面的 7 条心得:

技术是工具,也可以是资产,还可以是商品。

  • 技术有三个阶段:技术支撑业务,技术驱动业务,技术创造商业价值。这三个阶段技术是分别作为工具,资产以及商品存在的。

  • 我们看到的一个个互联网产品,背后都是由技术搭起来的,技术只是工具。

  • 随着业务发展,逐步沉淀面向某个问题的解决方案,有些以专利的形式体现,技术就成为了资产。

  • 把通用的技术提炼出产品能力,像阿里云的很多服务那样,技术就变成了商品。

提升效率。

  • 什么叫效率?

  • 效率就是你完成了多少事,除以你开始了多少事。你开始了一百件,只完成了一件,你的效率就是 1%。

  • 所以提高效率的办法,一个是你多完成事,第二个是你少开始事

打造自己的知识系统。

  • 人的大脑天生喜欢记忆结构化系统化的知识。零碎的知识点太多,也只是隐藏在大脑的某个角落,经常被忽视。

  • 关键是建立体系化的知识结构,去帮助生活和工作上的决策。

机会留给主动的人。

  • 主动向项目组同步进展,主动向领导汇报,主动把事情推向正确的方向。你会发现自己的运气在变好。

凡事需要平衡。

  • 一个算法要想获得更快的时间,势必要牺牲更多的空间。

  • 同样,无论项目方案还是架构设计,都没有对和错,要权衡当下更重视什么,可以容忍什么,做出适当的选择即可,后边可以再调节。

任何事都是一个 IPO。

  • I 是 Input,P 是 Process,O 是 Output,凡事都可以归为 输入-处理-输出 的路径,想好依赖方,处理方式以及交付物,事情就可以变得简单。

公司是你的放大器也是你的限制器。

  • 公司是一种组织,组织能辅助个人做成一些事,比如个人在组织中做项目得到成长,能得到优秀同事的帮助,能享受公司发展的红利,能获得公司的学习资源和其他福利。

  • 但个人做事往往会受组织的限制,比如制度约束,工作时长,发展方向等等。

  • 需要好好利用放大器,同时也要评估限制器是否超出了自己的容忍度。

相关文章:

谈谈一个程序员的职场心得(真有用)

谈谈一个程序员的职场心得 我会分为三个部分:软件开发,职场协作和认知成长,每个部分精简成 7 条心得。 软件开发 若无必要,勿增实体。 这是奥卡姆剃刀的定义,所谓剃刀就是法则,是奥卡姆这个英国学者提出来…...

Pytest:一个卓有成效的测试工具

大家都知道,目前最流行的Python单元测试框架有三种,分别是unittest, nose和pytest。其中unittest是Python自带的测试框架,但问题是比较老了,赶不上时代发展了(哈哈哈);nose2定位是带插件的unitt…...

Compose 动画 (三) : AnimatedVisibility 从入门到深入

1. AnimatedVisibility 是什么 AnimatedVisibility可以实现Compose组件的显示和隐藏,并且可以指定显示/隐藏时候的动画效果。(EnterTransition/ExitTransition) 和 animateXxxAsState、animateContentSize、Crossfade、AnimatedContent 这几个API一起,都…...

网络基础(二)

目录 应用层 再谈 "协议" 协议是一种 "约定". socket api的接口, 在读写数据时, 都是按 "字符串" 的方式来发送接收的. 如果我们要传输一些"结构化的数据" 怎么办呢? 为什么要转换呢? 如果我们将struct message里面…...

Java线程知识点总结

文章目录Java 线程基础线程简介什么是进程什么是线程进程和线程的区别创建线程ThreadRunnableCallable、Future、FutureTaskCallableFutureFutureTaskCallable Future FutureTask 示例线程基本用法线程休眠线程礼让终止线程守护线程线程通信wait/notify/notifyAlljoin管道线程…...

数据结构——第三章 栈与队列(4)

队列的应用1.基于队列的医院挂号模拟系统2.队列的运用1.基于队列的医院挂号模拟系统 代码实现分享 2.队列的运用 问题描述:某运动会设立N个比赛项目,每个运动成员可以参加1~3个项目。试问如何安排比赛日程,既可以使同一运动员参加的项目不…...

华为机试HJ73-计算日期到天数转换

HJ73 计算日期到天数转换 题目描述: 描述 根据输入的日期,计算是这一年的第几天。 保证年份为4位数且日期合法。 进阶:时间复杂度:O(n) ,空间复杂度:O(1) 输入描述: 输入一行,每行…...

【阅读笔记】你不知道的JavaScript--this与对象2

目录this默认绑定隐式绑定隐式丢失显示绑定API 调用上下文new 绑定this 绑定优先级其余绑定例外对象字面量与对象属性描述符迭代器遍历this 默认绑定 默认绑定适配 独立函数调用 默认绑定 this 指向全局对象; 故直接调用函数,该函数内部的 this 即指向全…...

单板TVS接地不当造成辐射骚扰超标问题分析-EMC

【摘要】 某产品EMC辐射骚扰测试超标,通过近远场扫描配合定位分析,逐步找出骚扰源、传播路径,最终通过修改 PCB 走线切断传播路径解决此问题。 1 故障现象 某产品在进行 EMC 研发摸底测试时发现,整机辐射骚扰垂直方向测试超标&a…...

用Python Flask为女朋友做一个简单的网站(附可运行的源码)

🌟所属专栏:献给榕榕🐔作者简介:rchjr——五带信管菜只因一枚😮前言:该专栏系为女友准备的,里面会不定时发一些讨好她的技术作品,感兴趣的小伙伴可以关注一下~👉文章简介…...

vue3+rust个人博客建站日记5-所有界面

没有数据的前端,是没有灵魂的。明明标题是vue3 rust ,但日记撰写至今,似乎只有第一篇提及了Rust,这可不行。是时候一股作气,完成大部分页面绘制工作了! 最后再说一次,时间要加速了。 ——普奇神…...

青少年软件编程C++一级真题(202212)

1、输入一个整数x&#xff0c;输出这个整数加1后的值&#xff0c;即x1的值。 时间限制&#xff1a;1000 内存限制&#xff1a;65536 输入 一个整数x&#xff08;0 ≤ x ≤ 1000&#xff09;。 输出 按题目要求输出一个整数。 样例输入 9样例输出 10 #include<iost…...

【Spring】AOP底层原理(动态代理)-》 AOP概念及术语 -》 AOP实现

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ AOP - 面向切面编程一、简述AOP二、AOP底层原理…...

Java8 新特性 之 lambda 表达 和 函数式接口

—— lambda 表达式 概念 lambda 表达式是一个匿名函数&#xff0c;可以把 lambda 表达式理解为是一段可以传递的代码。更简洁、更灵活&#xff0c;使 Java 的语言表达能力得到了提升lambda 表达式是作为接口的实现类的对象&#xff08;万事万物皆对象&#xff09; 使用语法…...

Netty服务端和客户端开发实例

一、Netty服务端开发在开始使用 Netty 开发 TimeServer 之前&#xff0c;先回顾一下使用 NIO 进行服务端开发的步骤。(1)创建ServerSocketChannel&#xff0c;配置它为非阻塞模式;(2)绑定监听&#xff0c;配置TCP 参数&#xff0c;例如 backlog 大小;(3)创建一个独立的I/O线程&…...

linux基本指令和权限

目录 一.shell命令以及运行原理 二.Linux常用指令 1. ls 指令 2. pwd命令 3.cd指令 4. touch指令 5.mkdir指令&#xff08;重要&#xff09; 6.rmdir指令 && rm 指令&#xff08;重要&#xff09; 7.man指令&#xff08;重要&#xff09; 8.cp指令&#xff08;重要&…...

滚蛋吧,正则表达式!

大家好&#xff0c;我是良许。 不知道大家有没有被正则表达式支配过的恐惧&#xff1f;看着一行火星文一样的表达式&#xff0c;虽然每一个字符都认识&#xff0c;但放在一起直接就让人蒙圈了~ 你是不是也有这样的操作&#xff0c;比如你需要使用「电子邮箱正则表达式」&…...

序列号和反序列化--java--Serializable接口--json序列化普通使用

序列化和反序列化序列化和反序列化作用为什么需要用途Serializable使用serialVersionUID不设置的后果什么时候修改Externalizable序列化的顺序json序列化序列化和反序列化 序列化&#xff1a;把对象转换为字节序列的过程称为对象的序列化。 反序列化:把字节序列恢复为对象的过…...

Java异步任务编排

多线程创建的五种方式&#xff1a; 继承Thread类实现runnable接口。实现Callable接口 FutureTask(可以拿到返回结果&#xff0c;阻塞式等待。)线程池创建。 ExcutorService service Excutors.newFixedThreadPool(10); service.excute(new Runnable01());另外一种创建线程池…...

Hive与HBase的区别及应用场景

当数据量达到一定量级的时候&#xff0c;存储和统计计算查询都会遇到问题&#xff0c;今天了解一下Hive和Hbase的区别和应用场景。 一、定义 Hive是基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张数据库表&#xff0c;并提供简单的sql查询功能&am…...

C++之单例模式

目录 1. 请设计一个类&#xff0c;只能在堆上创建对象 2. 请设计一个类&#xff0c;只能在栈上创建对象 3.请设计一个类&#xff0c;不能被拷贝 C98 C11 4. 请设计一个类&#xff0c;不能被继承 C98 C11 5. 请设计一个类&#xff0c;只能创建一个对象(单例模式) 设计…...

Redis十大类型——Set与Zset常见操作

Redis十大类型——Set与Zset常见操作Set命令操作简列基本操作展示删除移动剪切集合运算Zset基本操作简列添加展示反转按分数取值获取分数值删除分数操作下标操作如果我们对Java有所了解&#xff0c;相信大家很容易就明白Set&#xff0c;在Redis中也一样&#xff0c;Set的value值…...

车载雷达实战之Firmware内存优化

内存&#xff08;Memory&#xff09;是计算机中最重要的部件之一&#xff0c;计算机运时的程序以及数据都依赖它进行存储。内存主要分为随机存储器&#xff08;RAM&#xff09;,只读存储器&#xff08;ROM&#xff09;以及高速缓存&#xff08;Cache&#xff09;。仅仅雷达的原…...

【剑指Offer】JZ14--剪绳子

剪绳子详解1.问题描述2.解题思路3.具体实现1.问题描述 2.解题思路 首先想到的思路&#xff1a;因为是求乘积的最大值&#xff0c;所以如果截取剩下的是1&#xff0c;那还是它本身就没有意义。从此出发&#xff0c;考虑绳子长度是2、3、4、5…通过穷举法来找规律。 值–》拆分–…...

raspberry pi播放音视频

文章目录目的QMediaPlayerGStreamerwhat is GStreamer体系框架优势omxplayerwhat is omxplayercommand Linekey bindings运行过程中错误ALSA目的 实现在树莓派下外接扬声器&#xff0c; 播放某段音频&#xff0c; 进行回音测试。 QMediaPlayer 首先我的安装是5.11版本。 优先…...

【电子学会】2022年12月图形化二级 -- 老鹰捉小鸡

老鹰捉小鸡 小鸡正在农场上玩耍&#xff0c;突然从远处飞来一只老鹰&#xff0c;小鸡要快速回到鸡舍中&#xff0c;躲避老鹰的抓捕。 1. 准备工作 &#xff08;1&#xff09;删除默认白色背景&#xff0c;添加背景Farm&#xff1b; &#xff08;2&#xff09;删除默认角色小…...

C++的双端队列

双端队列介绍1.双端队列知识需知2.大试牛刀1.双端队列知识需知 由于队列是一种先进先出&#xff08;FIFO&#xff09;的数据结构&#xff0c;因此无法直接从队列的底部删除元素。如果希望从队列的底部删除元素&#xff0c;可以考虑使用双端队列&#xff08;deque&#xff09;。…...

【独家】华为OD机试 - 拼接 URL(C 语言解题)

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明本期…...

为什么使用Junit单元测试?Junit的详解

Hi I’m Shendi 为什么使用Junit单元测试&#xff1f;Junit的详解 Junit简介 Junit是一个Java语言的单元测试框架。 单元测试是一个对单一实体&#xff08;类或方法&#xff09;的测试 JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架&#xff08;regression test…...

怎么学好嵌入式Linux系统和驱动

嵌入式专业是一门实践性非常强的学科&#xff0c;只有多动手&#xff0c;多实践&#xff0c;多编程&#xff0c;多调试&#xff0c;多看书&#xff0c;多思考才能真正掌握好嵌入式开发技术。 现在很多同学也意识到了学校培养模式和社会需求脱节问题&#xff0c;有一部分同学也先…...