
? Web 应用开发工程师 | ? 吉他爱好者 | ? 终生学习者 | ✨ 极简主义信仰者 | ✍️ 科技专栏作家 | ? 图形学新手 | ? AI 技术狂热追踪者
今年已经是我从事软件开发行业的第七个年头,我觉得现在是一个好的时机向一些新入行的软件工程师分享一些我认为越早知道越好的知识。希望能对您有所启发。1. 需求总是会变也许您已经和团队成员评估了需求的合理性,并且达成了共识。您胸有成竹的认为产品需求不会再发生改变。但真相是残酷的,需求总是会因为各种各样的原因发生变化,例如:您或您的上司有了一个新的想法;产品的目标群体发生了变化;攻克某项技术的成本超出了预期;您需要意识到,正是因为这残酷的真相,我们才会有一个对于软件工程师重要的专业性评判标准:您是否能够编写有更好组织性的代码。这就引出了我们下一个主题。2. 始终以编写更好组织性代码为目标新手工程师有时候会执着于快速的实现功能,从而编写出「面条式」的代码,面条式代码是指代码一段段连接在一起,然后当代码规模到达一定程度后,会突然发现无法移动任何代码。任何对代码的改动,都将是一场噩梦。因此新手工程师要比有经验的工程师更加厌恶需求变动,因为他们需要花更多时间理解和修改代码,有时甚至是需要重写整个模块。所以,为了节省宝贵的时间,所有的工程师都应该站在更高的层次上,在编写代码前思考代码组织问题,我知道一些优秀的框架已经在语法层面上解决这个问题,但您应该在此基础上做的更好。更好的代码组织意味着:更稳定的应用;更少的 Bug;更清晰的代码结构;代码能够更加灵活的变通与扩展;您可以学习一些 MVC 思想,并将其应用在您的软件开发中。要知道「谋定而后动」在软件开发领域也是适用的。3. 代码有保质期相信我,您的代码总会过时,随着您技术水平的增长,功能的不断迭代,总有一天,您会发现有更好的方式可以组织您现有的代码。对于需要长期迭代的产品,放任代码过期,就是我们常说的「技术债务」。优秀的工程师不会给未来的自己或接手的下一任工作者留下太多债务,这事关开发者的责任心和声誉,需要引起重视。而且清除技术债务并非只是对产品有好处,在此过程中,您的技术水平也会不断提高。当您意识到代码临近过期,需要改动时,说明您的技术水平相较于以前已经大大提高了。处理过期代码有两种方式:重构:即保障功能接口输入/输出稳定,但内部结构优化的更加易读,易维护;完全删了,重头写:您很少有机会这么做,不过当一段代码已经没有人能够理解,维护成本过于高昂时,这么做是必要的;大多数工程师不重视代码重构工作,他们不了解或不愿意为代码添加单元测试并定期重构代码,这使得他们错失了宝贵的进步机会。作为新手工程师,您应该尽早意识到代码重构的重要性,并尽力劝说您的上级和合作伙伴,在开发计划中预留代码重构的时间。4. 不要重复造轮子新手工程师由于在工作初期认领不到有挑战性的工作,于是倾向于在实现功能模块时,即使有第三方库或框架可以使用,也会选择自己去实现。这一行为的出发点值得肯定,作为工程师,我们都想证明自己的实力,但是优秀工程师的核心能力之一是在于充分调动现有的成熟资源。很多时候,自己 DIY 的功能模块在健壮性和可靠性上都无法媲美社区成熟的功能模块,贸然使用自己 DIY 的功能模块会为产品添加风险,成熟的开发者应该极力避免。我建议新手工程师不妨换一种思路,我们都是站在巨人的肩膀上才能看的更远,与其在工作中花大把时间重复造轮子,不如利用业余时间研究成熟轮子的优势,并在工作中发现新的挑战。5. 文档是非常重要的这包含了两层意思:查阅文档非常重要;撰写文档非常重要;新手工程师有时会出于种种原因不愿意查阅官方文档,但事实是,查阅官方文档是工程师经常要做的事情。优秀工程师的核心职责是构思如何组织代码实现目标功能,并将其付诸实践,而查阅文档的过程,使我们准确挑选合适「建材」的必备途径。通过经常查阅文档,某个 API 最终会成为您的长期记忆,您的工作效率也会大大提升。与查阅文档同样重要的是撰写文档,很可惜大多数工程师要么是重视不足,要么是无法撰写易读的文档。而这两者对于一份好文档而言是十分重要的。文档的阅读者将会是所有对您当下工作感兴趣的人,包括未来的自己。对于一个没有文档或文档没有及时更新的大型项目而言,下场只有死亡。请积极撰写产品或技术文档吧!6. 如何面对陌生代码库无论是刚入职一家公司,还是换了一个项目组,我们总是无法避免接手一个陌生的代码库,新手程序员往往在此时手足无措,不知道如何开始。对此我的建议是:运行该应用,尝试修改一些代码,看看程序是如何运作的;分析目录结构,理解代码的组织方式;查看项目引入的第三方库,了解它们的作用是什么;对于要修改的核心逻辑,试着画一个流程图,搞清楚整个程序的逻辑是什么;请务必确保您已经基本掌握了代码逻辑,再着手进行改动,否则无疑将增加代码的坏味道,您很有可能会在将来某个意料之外的时刻不得不偿还债务。当您打算进入一个代码库,着手添加代码时,请务必确保您与原代码库的编码风格保持一致,即使您认为您的代码风格更加合理和优雅。这么做的好处在于:您的代码风格可能并非是最佳的,您在未来可能会对代码风格有新的想法;当每个项目的参与者都把自己个性化的代码风格带入代码中时,代码就会变得越发难以阅读,也容易让下一个接手的开发者感到迷惑;具备一定规模的开发团队,都会考虑统一代码风格,请您务必确保与团队要求的代码风格保持一致。如果您的团队没有统一的代码风格,那么就由您来主导建设吧,这正是您表现的好机会!除此之外,新手开发者应该坚定「我一定能做到」的信念,我可以坦率的告诉您,在 Web 开发世界里,没有什么神秘的魔法,所有的问题最终都可以被解决,无论是软件开发的新手还是老手,区别只在于解决问题的思路和时间。这正是软件开发行业的魅力所在,通过自己的努力解决一个棘手的问题,不仅会为所服务的企业解决问题,还能提升自己的专业水平,让心灵得到满足。所以请享受您当下的工作,并勇于解决任何问题。7. 始终学习,永不止步软件开发行业的特点之一便是,您需要通过不断学习提升自己在市场的竞争力,而编程世界也总是会有学不完的思想,技术和产品。您需要清楚地认识到一个残酷的事实,在大多数工作环境中,您获得进步的动力只能来源于自己。很多团队都没有完善的培训机制,也不会为您制定职业发展规划,团队成员疲于奔命完成自己的业绩或是不感兴趣与您讨论前沿的技术话题,所以您更需要保持警惕,寻求不断进步。请确保您的技术水平总是高于,至少是配的上您的工作年限。否则工作的时间越久,您的市场竞争力会越低。请勇敢的踏出当前的舒适圈。8. 总结在本篇文章中,我向您分享了我认为值得刚步入软件开发行业的新手们需要注意的 7 件事。这些事一些是我希望我在刚入行时有人告诉我的,一些是我从事本行业以来的一些经验之谈,感谢您的阅读,也期待您在评论区补充您的经验,让更多人受益。
本文假设您已经在云服务器中成功安装了 Docker 并下载了 mongo 镜像。1. 创建配置文件使用 Docker 部署 MongoDB 时,容器默认不会自动生成 mongod.conf 配置文件,需要开发者手动映射云服务器上的配置文件至容器内部,因此,我们需要先创建一份配置文件,您可以任意选择该文件的存储目录,这里我们假设存储路径为 /mongo/mongod.conf。配置文件内容如下:# 数据库存储路径 dbpath=/var/lib/mongodb # 日志文件路径 logpath=/var/log/mongodb/mongod.log # 监听的端口 port=27017 # 允许所有的 IP 地址连接 bind_ip=0.0.0.0 # 启用日志记录 journal=true # 启用身份验证 auth=true 注意 bind_ip 的设定非常重要,它使得我们能够远程连接数据库!2. 创建 MongoDB 容器使用如下 Docker 命令部署 MongoDB 容器:docker run --name <your db name> \ -p <hostport>:27017 \ -v <config file address>:/etc/mongod.conf \ -v <dbpath>:/var/lib/mongodb \ -v <logpath>:/var/log/mongodb/mongod.log \ -d \ mongo \ --auth请按照您的实际情况替换 <> 内的内容,在这条命令中,从上至下我们制定了:容器名;云服务器与容器内部的端口映射;配置文件映射;数据存储路径映射;日志路径映射;持久化后台运行;镜像名称;需要身份验证;3. 创建身份信息您需要使用 docker exec -it <your db name> mongosh 进入 MongoDB 数据库。 MongoDB v6 版本不再使用 mongod 命令作为客户端,而使用 mongosh!使用下面的命令创建管理员账户:use admin db.createUser({user: "<username>", pwd: "<password>", roles: [{role: "root", db: "admin"}]})使用管理员账户进行身份验证:mongo -u <admin> -p <password> --authenticationDatabase admin创建数据库与普通账号:use <database_name> db.createUser({user: "<username>", pwd: "<password>", roles: [{role: "readWrite", db: "<database_name>"}]})4. 对外开放端口我们必须开放云服务器端口才能支持远程访问,为此我们需要先查看目前已开放端口(当前为 CentOS):sudo firewall-cmd --list-all然后开放目标端口,注意,需使用 --zone=docker 参数:sudo firewall-cmd --zone=docker --add-port=<the port>/tcp --permanent 默认情况下,CentOS 会使用 firewalld 防火墙来管理网络连接。每个连接/接口都被分配到一个特定的区域,例如 public、private 或 docker 等。每个区域都具有一组默认的防火墙规则,用于控制该区域的网络流量。最后,如果您使用的是阿里云,您需要登录阿里云控制台,手动在「安全组」一项开启目标端口!5. 使用 Studio 3T 连接数据库Studio 3T 是一个免费的 MongoDB GUI,当您下载完成后,您可以通过如下方式访问我们的数据库:点击左上角 connect 图标,点击 New Connection 按钮:在 URI 中填写 MongoDB URI:mongodb://<username>:<password>@<IP address>:<port>/<database name>。至此,您完成了 MongoDB 的部署,并成功通过 Studio 3T 进行远程连接!6. 总结在本篇文章中,我们介绍了如何使用 Docker 部署 v6 版本的 MongoDB 数据库,并使用 Studio 3T 远程连接。目前,很多记述该内容的文章要么不完整,要么不支持 MongoDB v6 版本,这使得部署 MongoDB v6 版本变得不那么轻松,希望我这篇文章能够帮助各位降低部署的难度。如果您在部署的过程中遇到困难,也欢迎您将困难和解决方案附加到评论中,以帮助其他人更方便的操作。
2023年04月