刚进公司就负责项目,把老弟整蒙了!
刚进公司就负责项目,把老弟整蒙了!
大家好,我是鱼皮,先把封面图送给大家:
又快到周末了,今天分享一些轻松的编程经验~
还记得我学编程的老弟小阿巴么?他目前大二,听说最近刚刚找到了一家创业公司的暑期实习。
前两天小阿巴又跑来向我诉苦了:鱼皮 gie gie,我不是找了份暑期实习嘛,结果还没到暑假呢,公司的老大就联系我了,说公司最近有很多新项目要启动,等我暑假再来准备估计来不及了,让我提前先调研一下新项目的技术选型。
鱼皮:这不是挺好的么?还没进公司,就已经成为项目负责人了哈哈。
小阿巴:好个毛 🥚 啊,以前我自己都是跟着网上的教程学做项目,把老师的代码拉下来改几下,这让我负责一个项目,我一点底气和思路都没有。还有他说的什么 “技术选型”,我都没听说过!彻底蒙圈了。。。
鱼皮:嗯,这确实是个问题,看来得跟你科普一下 “技术选型” 了。先考你一下,你知道什么是技术选型么?
小阿巴:emm,我猜就是用什么技术来开发这个项目?比如开发前端用 Vue、开发后端用 Spring Boot?
鱼皮:不错,如果把做项目比喻成打仗,那么技术选型就相当于打仗之前选择武器。你要选择合适的武器才能打胜仗,选择合适的技术才能更好地完成项目。
小阿巴:但有个问题,现在主流的开发技术不就那么几种么,像我上面说的 Vue、Spring Boot?有啥好选的?
鱼皮:你说的其实只是技术选型的其中一点,也是最浅的一层。技术选型不止有 “选择开发框架”,还包括很多不同的方面和细节。
由浅入深来看,技术选型包括:
1)用哪类技术?比如编程语言、开发框架、数据存储、缓存
2)具体用什么技术?比如编程语言用 Java 还是 Go?开发框架用 Spring 还是 Netty?缓存用 Redis 还是 Memcached?
3)技术用哪个版本?比如用 Java 8 还是 11?Vue 2 还是 Vue 3?Redis 5 还是 6?
4)具体用到哪些技术特性?比如 Spring 的 AOP、Redis 的 GEO 高级数据结构等。
小阿巴:我滴妈呀!这么复杂嘛,我之前根本没想过这些,好像也想不到。。。
鱼皮:这是很正常的,因为之前你都是自己跟着教程做项目,用什么技术、用哪个版本都是老师给你提前规划好的。
小阿巴:确实唉,我觉得有点太麻烦了。。。能不能不做技术选型呀!老夫直接用 Spring Boot + Vue 一把梭。
鱼皮:哈哈,技术选型当然不是绝对的呀,比如你在学校自己做项目,那你就用熟悉的技术或者想学的技术即可。但是等当你进入企业、尤其是负责项目时,就必须要跟团队同学一起确认技术选型。而且对于规模越大、越复杂的项目,你要考虑的技术选型的角度和深度要求就越高!不能再像自己做项目一样随便了。
小阿巴:我就随便,又怎样?
鱼皮:可以的,我看你是不到黄河心不死不见棺材不落泪欲穷千里目更上一层楼啊!给你讲讲我在学校的时候有次带团队做项目时,不做技术选型的翻车经历吧。
很多年前了,当时我们在做一个校园贴吧网站,记得我是用 React 来开发前端页面的。刚开始很顺利,但直到有一天需要开发帖子页面信息状态保存功能的时候,才发现 React 不像 Vue Router 一样有现成的 keep-alive,后来又花了好久才找到一个类似的组件,结果还一堆 Bug。。。
唉,当时确实是经验不足呀。如果最开始就考虑到这点,选择 Vue 系列技术栈,那么就能节省很多时间了。
小阿巴:我悟了!就是说在开发一个完整项目前,我们要先整体思考一下实现项目功能可能会用到的一些技术,这样不至于到后面才发现难以实现?
鱼皮:good,是这样。越是对项目侵入性强的技术,后期的改动成本就越大。比如我刚刚举的例子,等你页面都写了几十个了,再去切换开发框架,就会很麻烦;而且有的时候,你给项目引入新的组件或类库,可能会和现有的库版本冲突,导致后面项目跑不起来。这些其实都是技术选型不当带来的问题,也是我们做技术选型的必要性。
小阿巴:原来如此,那做技术选型有没有什么好的经验呢?
鱼皮:一句话,我们做技术选型的目标是 在有限的条件下、选取特定场景下的技术最优解。
有限条件包括我们团队同学会的技术、我们的时间和金钱成本。比如大家都只会 Java、项目又急着上线,那肯定优先选择 Java 相关技术栈,不要因为什么 Go 语言的性能高就让大家加班去学 Go。再比如公司很有钱,但是缺人手,那么很多服务(比如数据库)就不用自己搭建了,直接买大厂云服务即可。
特定场景是指我们的技术选型一定要围绕着业务和需求来做,可以思考以下几点:
- 你的业务量级有多大:如果用户数巨多,要不要用 Nginx 或者 LVS 来做个负载均衡?如果存储量巨大,要不要使用分布式数据库、要不要搞分库分表?
- 系统的核心业务流程和关键数据结构是什么?比如要做一个管理系统,那么数据库选择主流的关系型数据库 MySQL 就好。而如果要做数据分析系统,那么应该选择 OLAP 利好的数据库,比如 Postgre SQL、ClickHouse 等。
- 系统更注重哪些性能?比如日志收集的场景更注重高性能和吞吐量,那么可以选择 Kafka 消息队列来采集;比如注重低延迟以及消息的准确性,那么可以选择 RabbitMQ 等。很多时候,我们做技术选型和设计算法一样,没有绝对的最优解,而是对时间、空间、稳定性、可用性等等的综合权衡。
小阿巴:大哥,我悟了,您别念了!
鱼皮:哈哈,另外还有两个建议
- 做技术选型时,可以通过编写最简单的 Demo 来快速验证下技术是否可用,不要直接拍板!
- 原则上优先选择知名度高的、开源的、用户多生态好的技术,没几个人用的技术,估计你用的话就是踩雷去了。
小阿巴:我明白了,那我就先问清楚我们这个项目大概要做哪些功能、预计有多少用户和存储需求,再根据这些到网上搜技术选型!
鱼皮:糊涂啊!都 2023 年了,直接问 ChatGPT!
我的编程导航网站:https://www.code-nav.cn
相关文章:
刚进公司就负责项目,把老弟整蒙了!
刚进公司就负责项目,把老弟整蒙了! 大家好,我是鱼皮,先把封面图送给大家: 又快到周末了,今天分享一些轻松的编程经验~ 还记得我学编程的老弟小阿巴么?他目前大二,听说最近刚刚找到…...
【Python基础入门学习】Python高级变量你了解多少?
认识高级变量 1. 列表 list1.1 列表的定义1.2 列表常用操作关键字、函数和方法 1.3 循环遍历1.4 列表嵌套1.5 应用场景 2. 元组 tuple2.1 元组的定义2.2 元组常用操作2.3 应用场景 3. 字典 dictionary3.1 字典的含义3.2 字典常用操作3.3 应用场景 4. 字符串 string4.1 字符串的…...
《LearnUE——基础指南:上篇—3》——GamePlay架构WorldContext,GameInstance,Engine之间的关系
目录 平行世界是真实存在的吗? 1.3.1 引言 1.3.2 世界管理局(WorldContext) 1.3.3 司法天神(GameInstance) 1.3.4 上帝(Engine) 1.4 总结 平行世界是真实存在的吗? 1.3.1 引言 …...
重大问题,Windows11出现重大BUG(开始菜单掉帧,卡顿)
重大问题,Windows11出现重大BUG 这种Windows11操作系统出现BUG已经可以说是非常常见的,但是,今天我将代表所有微软用户,解决一个关于UI设计非常不舒服的功能 关闭多平面覆盖 事情叙述问题 微软社区解决方案自己发现的解决方案解决…...
修改系统语言字体的方法及注意事项
Android修改系统语言字体 随着我们生活品质的提升,现在人们对于手机的依赖越来越高,而且对于手机的功能也有了更高的要求。其中,界面的字体对于我们视觉的体验感受非常重要。而在Android系统中,默认的字体可能并不符合我们的胃口。…...
19.考虑柔性负荷的综合能源系统日前优化调度模型
说明书 MATLAB代码:考虑柔性负荷的综合能源系统日前优化调度模型 关键词:柔性负荷 需求响应 综合需求响应 日前优化调度 综合能源系统 参考文档:《考虑用户侧柔性负荷的社区综合能源系统日前优化调度》参考柔性负荷和基础模型部分…...
Midjourney关键词分享!附输出AI绘画参考图
Midjourney 关键词是指用于 Midjourney 这个 AI 绘画工具的文本提示,可以影响生成图像的风格、内容、细节等。Midjourney 关键词有一些基本的语法规则和套用公式,也有一些常用的风格词汇和描述词汇,这里我以10张不同风格和类型的美女图为例&a…...
网络安全行业就职岗位有哪些?
网络安全作为目前最火的行业之一,它的细分方向很多。下面介绍一下网络安全主要的方向岗位有哪些,以及职责是什么? 一、安全规划与设计方向 岗位名称:系统安全需求分析师。 岗位职责:负责对目标对象需要达到的安全目标…...
数据库设计-范式
范式 范式就是数据库的构建规则,目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF&#x…...
在前端开发中,何时应该使用 jQuery,何时应该使用 Vue.js
如果您是最近才开始进入 Web 前端开发领域的开发人员,那么您可能会听说过 jQuery。jQuery 是一个小巧而功能强大的 JavaScript 库,旨在简化跨浏览器 DOM 操作、事件处理、动画效果和 AJAX 等方面的操作,可以让开发人员更轻松地开发出高质量的…...
Promise类方法
这篇主要讲一下Promise的类方法的基本使用,至于Promise的基本使用这里就不赘述了,之前也有手写过Promise、实现了Promise的核心逻辑。其实我们平时用Promise也挺多的,不过又出现了两个新的语法(ES11,ES12新增了两个&am…...
transformer and DETR
RNN 很难并行化处理 Transformer 1、Input向量x1-x4分别乘上矩阵W得到embedding向量a1-a4。 2、向量a1-a4分别乘上Wq、Wk、Wv得到不同的qi、ki、vi(i{1,2,3,4})。 3、使用q1对每个k(ki)做attention得到a1,i(i{1,2,3,4…...
数据结构(六)—— 二叉树(4)回溯
文章目录 一、题1 257 二叉树的所有路径1.1 写法11.2 写法2 一、题 1 257 二叉树的所有路径 1.1 写法1 递归回溯:回溯是递归的副产品,只要有递归就会有回溯 首先考虑深度优先搜索;而题目要求从根节点到叶子的路径,所以需要前序…...
JVM基础知识(一)
1.整体架构和组件 1.Class Loader Class Loader(类加载器)负责将.class文件加载到JVM中,并生成对应的Java类对象(Class对象)。Java中有三种类加载器: Bootstram ClassLoader:加载核心类库&…...
ASP.NET Core Web API用户身份验证
一、JWT介绍 ASP.NET Core Web API用户身份验证的方法有很多,本文只介绍JWT方法。JWT实现了服务端无状态,在分布式服务、会话一致性、单点登录等方面凸显优势,不占用服务端资源。简单来说,JWT的验证过程如下所示: &a…...
785. 快速排序
785. 快速排序 给定你一个长度为 n n n 的整数数列。 请你使用快速排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 输入格式 输入共两行,第一行包含整数 n n n。 第二行包含 n n n 个整数(所有整数均在 1 ∼ 1 0 9 1 \th…...
C6678学习-IPC
文章目录 1、简介2、模块MultiProc静态设置(cfg设置)动态设置 IPCNotifyMessageQShareRegion 1、简介 IPC: Inter-Processor Communication 处理器间通信,指提供多处理器环境中的处理器之间的通信、相同处理器不同线程间的通信。包括数据传递…...
利用 Delte-Sigma ADC简化电路设计
很多时候在电路中选择合适的 ADC可以很大程度上简化前端的电路。这里我们一起来看一个电阻电桥的例子: 这里用到了一只仪表放大器和一只运算放大器,他们实际上主要完成了三个功能: 1. 抑制了 2.5V的共模信号; 2. 将-1…...
如何在 Windows 11 启用 Hyper-V
准备在本机玩一下k8s,需要先启用 Hyper-V,谁知道这一打开,没有 Hyper-V选项: 1、查看功能截图: 2、以下文件保存记事本,然后重命名为*.bat pushd "%~dp0" dir /b %SystemRoot%\servicing\Packa…...
哈希表企业应用-DNA的字符串检测
DNA的字符串检测-引言 若干年后, ikun DNA 检测部成立,专门对 这些ikun的解析检测 突然发现已经完全控制不了 因为学生已经会了 而且是太会了 所以DNA采用 以下视频测试: ikun必进曲 ikun必经曲 ikun必阶曲 如何感受到了吧!,如果你现在唱跳并且还Rap 还有打篮球 还有铁山靠 那…...
Kafka运维与监控
Kafka运维与监控 Kafka运维与监控一、简介二、运维1.安装和部署安装部署 2.优化参数配置配置文件高级配置分区和副本设置分区数量设置副本数量设置 网络参数调优传输机制设置连接数和缓冲区大小设置 消息压缩和传输设置消息压缩设置消息传输设置 磁盘设置和文件系统分区磁盘容量…...
【Redis—哨兵机制】
文章目录 概念哨兵机制如何工作的监控(如何判断主节点真的故障了)哪个哨兵进行主从故障转移?故障转移流程哨兵集群 概念 当进行主从复制时,如果主节点挂掉了,那么没有主节点来服务客户端的写操作请求了,也…...
MySQL学习笔记第七天
第07章单行函数 2. 数值函数 2.4 指数函数、对数函数 函数用法POW(x,y),POWER(X,Y)返回x的y次方EXP(X)返回e的x次方,其中e是一个常数,2.718281828459045LN(X),LOG(X)返回以e为底的X的对数,当x<0时,返…...
中级软件设计师备考---程序设计语言和法律法规知识
目录 需要掌握的程序语言特点法律法规知识---保护期限法律法规知识---知识产权人确定法律法规知识---侵权判定标准化基础知识 需要掌握的程序语言特点 Fortran语言:科学计算、执行效率高Pascal语言:为教学而开发的、表达能力强,演化出了Delp…...
Leetcode434. 字符串中的单词数
Every day a leetcode 题目来源:434. 字符串中的单词数 解法1:istringstream 我们知道,C默认通过空格(或回车)来分割字符串输入,即区分不同的字符串输入。 istringstream类用于执行C风格的串流的输入操…...
C++ cmake工程引入qt6和Quick 教程
目录标题 前言QML简介锻炼C水平 cmake修改方法方式一(qt6_add_resources)方式二 (qt_add_qml_module ) 其他相关知识为什么会有_other_files?qt_standard_project_setup() 函数qt_add_qml_module() 和 qt6_add_resources()的方式差异const QU…...
JavaEE - 网络编程
一、网络编程基础 为什么需要网络编程? 用户在浏览器中,打开在线视频网站,如优酷看视频,实质是通过网络,获取到网络上的一个视频资源。 与本地打开视频文件类似,只是视频文件这个资源的来源是网络。 相比本…...
【Android车载系列】第11章 系统服务-SystemServer自定义服务
1 编写自定义系统服务 1.1 AIDL接口定义 系统源码目录/frameworks/base/core/java/android/app/下新建AIDL接口IYvanManager.aidl package android.app;/** * 目录:/frameworks/base/core/java/android/app/IYvanManager.aidl */ interface IYvanManager{String …...
Lerna
Lerna Lerna是一个优化基于gitnpm的多pagkage项目的管理工具 解决的痛点 痛点一:重复操作 多Package本地link多Package依赖安装多Package单元测试多Package代码提交多Package代码发布 痛点二:版本一致性 发布时版本一 致性发布后相互依赖版本升级 package越多,管…...
迁移学习 pytorch
迁移学习(Transfer Learning)是通过使用一个预训练模型来快速训练一个新的网络模型,通常应用于数据集较小或计算资源较少的情况下。在 PyTorch 中,由于 torchvision 库中已经内置了一些经典的预训练模型,因此我们可以通过简单的调用函数来实现迁移学习。 下面是一个基于 …...
可以做的电影网站/seo推广公司招商
最近我在接受采访时被问到我关于成为一名伟大的程序员见解。这是一个有趣的问题,我认为我们都可以是伟大的程序员,无论我们的天赋如何,如果我们遵循一些规则的话——我相信——这应该是常识。实际上,这些规则并不只适用于编程领域…...
微信做明天展现网站要多少钱/免费推广自己的网站
大致思路: 后序遍历用栈来实现: 逆后序遍历前序遍历的左右子树入栈顺序交换;逆后序->后序,采用栈2来倒置输出 需要注意的是,如何定义栈。之前用stack<TreeNode* >来定义,但是总会出现什么编译错…...
ecshop二次开发网站开发心得/百度指数在线查询前100
物业软件对管理的作用分析1、减少人工,节省成本使用软件后六岗合一:财务人员计费人员档案管理人员收费人员制表统计人员录入员只需一个收费员假设只节省一个人,一年节省:1000元/月*12个月12000元/年;若5个小区…...
做动画网站去哪采集/中国最厉害的营销策划公司
本文地址:http://www.cnblogs.com/archimedes/p/win-tc-graphics-use.html,转载请注明源地址。 由于最近接到一个紧急任务,需要实现一个程序,显示一些分形几何中的图形,例如:Koch曲线 感觉java的swing的界面…...
广州达美网站建设公司/百度站长收录提交入口
常用组件axios(http请求模块,可用于前端任何场景,很强大)echarts-for-react(可视化图表,别人基于react对echarts的封装,足够用了)recharts(另一个基于react封装的图表,个人觉得是没有echarts好用)nprogress(顶部加载条…...
ps切片怎么做网站/南宁seo计费管理
删除字典中的null 我们在处理数据库接口的过程中,如果数据中出现null,我们是没法处理的。我在使用NSUserDaults保存后,出现崩溃。 null产生原因 null是后台在处理数据的时候,如果没有设置value值,数据库默认填充的值。…...