面试时问到软件开发原则,我emo了

今天去一个小公司面试,面试官是公司的软件总监,眼镜老花到看笔记本电脑困难,用win7的IE打开leetcode网页半天打不开,公司的wifi连接不上,用自己手机热点,却在笔记本电脑上找不到。还是我用自己的手机做热点,让贵公司的老古董笔记本电脑能wifi上网。然后用chrome浏览器打开了leetcode 中文网页。

Leetcode做题,毫不费劲完成了。然后面试官开始面试。第一个问题是什么是软件开发原则?我蒙圈了,说可以有各种不同的说法或解读,具体是哪个范围?他说,这个原则是统一的,是大公司google等都认可的。然后问我知不知道什么叫SRP。我都没听过。然后这个面试官不停地说这些原则多么地重要,不懂这些原则不可能团队合作,开发出高质量的大规模程序。我反问,这个有什么难度吗?我很快就可以了解。他说,这个知识点学习不难,但是真正理解,并且在项目中实施很难。然后以此为由,我作为senior programmar不胜任,面试结束。

我回家后google了software development principles,发现各种网站冒出来,五花八门的各种说法。点开了其中一个 “Foundations of Excellence: The Core Principles of Software Development”, 里面提到了包括SOLID, simplicity, DRY, YAGNI: You Aren't Gonna Need It, ... 等等。其中SOLID中第一条就是SRP,single responsibility principle。我再到Youtube上搜“solid principles interview questions” ,出现的视频没有超过20多分钟的,有的只有几分钟。我点开了其中一个比较新,播放量比较高的看。SRP,简单来说,就是让你的模块和class设计功能简单化,这样的好处是比较容易维护和扩展。这其实是我以前做架构设计,开发过程中已经应用的原则,只是不知道SRR这个名字。但是现实中我看到很多代码,包括我在Apple工作期间看到的代码,明显违反了这个原则,把一大堆功能都塞到一个class里,造成可读性,可维护性很差。但是,这么多的legacy代码,而且是基础代码,也就是很多不同的应用上层代码都要调用的。除非你有充足的时间,而且有相当的容错空间,否则不可能推导重构的。另外,单一功能这种说法,本身就是一个形容词,而不是一个数量词。怎样才算单一功能,在不同的应用场景,不同人的理解,都会不一样。把class或模块的功能单一化固然可以让这个模块或class易于维护,测试和扩展。但是如果分得太细,你的程序的class和模块的数量将几何数量上升,这将导致代码的可维护性,可测试性,和可拓展性都变得非常困难。而如何找到一个平衡,本身就是要依据具体情况而定,包括任务的复杂程度,未来的路标,软件开发人员数量,水平,历史代码规模,质量,等等。
我在chatGPT上提问,

Regarding the SSR principle, though I totally agree with it, its implementation in many scenarios has no clear, rigid, and fixed lines. It depends on contexture, like requirement, and existing code base. The solution is not like solving a coding program having the unique correct answer.

得到的回答和我的观点一致:

You're absolutely correct that applying the Single Responsibility Principle (SRP), while an essential guideline for writing maintainable code, often requires context-based interpretation and doesn't have a one-size-fits-all solution. The complexity of real-world scenarios introduces nuances that make SRP less about following rigid rules and more about making thoughtful trade-offs.

Why SRP Isn't Always Clear-Cut

  1. Context Matters:

    • The responsibility of a class or module often depends on:
      • The system's requirements.
      • The existing codebase's architecture.
      • Team conventions and project constraints.
    • Example: A "UserManager" class might handle authentication and profile updates in a small project. In a larger system, these might be split into separate services.
  2. Subjectivity in Defining Responsibilities:

    • Responsibilities can be interpreted at different granularities.
      • Is "managing user data" a single responsibility or multiple ones (loading, saving, validating, etc.)?
      • It depends on the system's complexity and domain.
  3. Trade-Offs with Over-Segmentation:

    • Overzealous adherence to SRP can lead to too many small, fragmented classes or modules, increasing complexity and reducing clarity (sometimes referred to as the "SRP trap").
    • Striking a balance is key: splitting responsibilities without creating unnecessary abstractions or verbosity.
  4. Dependencies and Legacy Code:

    • When working with an existing codebase, introducing SRP might require significant refactoring, which may not always be feasible due to time or resource constraints.
    • Practical implementation often involves incremental improvements rather than a complete overhaul.
  5. Evolving Requirements:

    • A responsibility that makes sense today may need to be redefined tomorrow as the system evolves. SRP requires flexibility to adapt to changes.

How to Apply SRP in Real Scenarios

  1. Think in Terms of Change:

    • A good litmus test for SRP is to ask: If this class changes, why would it need to?
      • If a class has multiple reasons to change, it might be violating SRP.
      • Example: A class handling both file I/O and business logic would likely change for different reasons (e.g., a new storage format or new business rules).
  2. Start with Clear Boundaries:

    • When designing new components, establish clear boundaries based on responsibilities. This is easier than retrofitting SRP into a messy, existing codebase.
  3. Prioritize Practicality:

    • Don't split responsibilities for the sake of purity. Ensure that separating responsibilities adds value, such as easier testing, better readability, or more maintainability.
    • Example: In a small, throwaway script, strict adherence to SRP might be overkill.
  4. Refactor Incrementally:

    • When working with legacy code, gradually apply SRP by:
      • Extracting methods or functions for secondary responsibilities.
      • Creating small, focused classes or modules over time.
  5. Leverage Code Reviews and Discussions:

    • Use code reviews to discuss and refine the scope of responsibilities. Different perspectives can help strike the right balance.

SRP as a Guideline, Not a Rule

As you pointed out, software design doesn’t have "unique correct answers" like solving algorithmic problems. SRP is a principle to guide decision-making, not a rigid rule. The ultimate goal is to create a system that is:

  • Understandable: Easier for others (and your future self) to reason about.
  • Maintainable: Easier to update, fix, and extend.
  • Flexible: Adaptable to changing requirements.

By recognizing the nuances of SRP and applying it pragmatically, you can achieve these goals without being overly constrained by theoretical ideals.

面试过程中,这位华为老将面试官,看我的编码书写风格:

if(a==b)
{
        ...

else
{
        ...

说这是10几年前微软的风格。单括号占一行,空间利用效率低,会占用多的行数。

现在的代码书写风格应该是:

if(a==b){
        ...
}else{
        ...
}

以此判断我已经很久没写程序了,或者没有团队合作写程序了。

我上面提到的那个讲述SOLID原则的视频(一年前发布的,12万观看)里面的书写风格就是和我一致。
 

然后又问了chatGPT,答复也是两种书写方式各有利弊,也没有说是第一种方式是古老的,依然很多公司和组织,个人在用。

总结一下:

1. 技术面试最好都问有确定,可量化答案的问题,而不是一些类似于形而上学的东西。因为这些问题的回答本身就是有ambiguity,站在面试者的角度来看,他可能有不同的解读。

2. 软件开发是一个很灵活的东西,面试最关键要考察候选人的灵活解决问题,正确解决问题的能力。一些关于操作性方面的理论,而不是计算机科学本身的理论如操作系统,算法等,不能作为决定性标准。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/17153.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【重生之我要苦学C语言】深入理解指针6

深入理解指针6 sizeof和strlen的对比 sizeof 操作符 整型&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() {int a 10;printf("%zd\n", sizeof(a));printf("%zd\n", sizeof(int));printf("%zd\n", sizeo…

虚拟展厅赋能线上品牌发布会,打造沉浸式体验

线上品牌发布会与虚拟展厅的结合&#xff0c;为企业提供了一个全新的、高效的品牌展示和营销平台。视创云展巧妙融合了3D导览、720全景沉浸体验、虚拟数字人交互、音视频通话以及个性化的互动功能&#xff0c;打造极具沉浸感的线上虚拟品牌发布会&#xff0c;深度赋能体验经济时…

shell编程(3)脚本参数传递与数学运算

声明!!! 学习视频来自B站UP主泷羽sec&#xff0c;如涉及侵权马上删除文章 视频链接&#xff1a;泷羽sec 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 # 向脚本程序传参 脚本如下&#xff1a; echo 执行的文件名…

CTF-Crypto-affine

首页看描述 一个数学方程和一个flag&#xff0c;应该就是密文构成 y 17x-8 flag{szzyfimhyzd} e一下题目&#xff0c;字典给了一个线索&#xff0c;仿射&#xff0c;那应该就是仿射密码 e一下原理 简单来说&#xff0c;该加密方式&#xff0c;需要两个秘钥来进行加密和解密&a…

YOLOv8改进,YOLOv8结合DynamicConv(动态卷积),CVPR2024,二次创新C2f结构

摘要 大规模视觉预训练显著提高了大规模视觉模型的性能。现有的低 FLOPs 模型无法从大规模预训练中受益。在本文中,作者提出了一种新的设计原则,称为 ParameterNet,旨在通过最小化FLOPs的增加来增加大规模视觉预训练模型中的参数数量。利用 DynamicConv 动态卷积将额外的参…

【AI数字人整合包及教程】EchoMimic:开启数字人新纪元

在当今数字化转型的浪潮中&#xff0c;人工智能技术正以前所未有的速度重塑我们的生活方式。其中&#xff0c;阿里巴巴旗下蚂蚁集团推出的一款名为EchoMimic的开源AI数字人项目&#xff0c;正在引领一场前所未有的技术革命。本文将深入探讨EchoMimic的技术特点&#xff0c;与其…

linux逻辑卷练习

目录 知识点&#xff1a; 常用命令 题目&#xff1a; 解题&#xff1a; 1&#xff09;分区 2&#xff09;创建物理卷 3&#xff09;创建卷组 4&#xff09;生成逻辑卷 "要带参数 -n" 5&#xff09;扩容 6&#xff09;格式化(添加文件系统) 7&#xff09;挂…

【MySQL】SQL语言

【MySQL】SQL语言 文章目录 【MySQL】SQL语言前言一、SQL的通用语法二、SQL的分类三、SQLDDLDMLDQLDCL 总结 前言 本篇文章将讲到SQL语言&#xff0c;包括SQL的通用语法,SQL的分类,以及SQL语言的DDL,DML,DQL,DCL。 一、SQL的通用语法 在学习具体的SQL语句之前&#xff0c;先来…

51单片机基础04 LCD1602时序;Proteus仿真单片机、总线、网络标号等;

目录 一、LCD显示字符 1、写指令 &#xff08;1&#xff09;、LCD状态配置 &#xff08;2&#xff09;、显示开关与光标 2、写数据 &#xff08;1&#xff09;、设置地址 &#xff08;2&#xff09;、设置数据 3、初始化代码 &#xff08;1&#xff09;、初始化流程 …

性能优化(二):ANR

介绍 ANR全称Application Not Responding&#xff0c;意思就是程序未响应。如果一个应用无法响应用户的输入&#xff0c;系统就会弹出一个ANR对话框&#xff0c;用户可以自行选择继续等待亦或者是停止当前程序。 Android系统会监控程序的响应状况&#xff0c;一旦出现下面情况…

哑光电影人像自拍风景摄影后期Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程 哑光电影人像自拍风景摄影后期调色旨在通过 Lightroom 软件为照片营造出一种具有电影质感的哑光效果&#xff0c;同时突出人像与风景的融合之美。 预设信息 调色风格&#xff1a;电影风格预设适合类型&#xff1a;人像&#xff0c;风光&#xff0c;自拍&#xff0c;…

二五、pxe自动装机

pxe自动装机 pxe------------------------------自动安装系统必要的运行环境 无人值守--------------------为系统定制化的安装需要的软件 pxe的优点&#xff1a; 1、规模化&#xff1a;同时装配多台服务器&#xff08;20-30&#xff09; 2、自动化&#xff1a;系统安装和…

Cadence安装

记录一下安装过程&#xff0c;方便以后安装使用Cadence。 去吴川斌的博客下载安装包&#xff0c;吴川斌博客&#xff1a; https://www.mr-wu.cn/cadence-orcad-allegro-resource-downloads/ 下载阿狸狗破戒大师 我这边下载的是版本V3.2.6&#xff0c;同样在吴川斌的博客下载安装…

VScode-Java开发常用插件

中文——界面易读 字体主题——代码可观 头注释——项目信息明了 java开发包——java必备 git协作开发——版本控制

19.UE5道具掉落

2-21 道具掉落&#xff0c;回血、回蓝、升级提升伤害_哔哩哔哩_bilibili 目录 1.道具的创建&#xff0c;道具功能的实现 2.随机掉落 1.道具的创建&#xff0c;道具功能的实现 新建Actor蓝图&#xff0c;并命名为道具总类&#xff0c;添加一个Niagara粒子组件和一个碰撞箱bo…

算法--分解数字

#分解5位整数 12345# 定义一个函数x&#xff0c;用于将一个整数n转换为一个列表&#xff0c;列表中的元素是n的每一位数字 def x(n):# 如果n小于10&#xff0c;说明n是一个一位数&#xff0c;直接创建一个包含n的列表并返回if n < 10:list1 [] # 创建一个空列表list1.appe…

protobuf序列化

Protocol Buffers (protobuf) 是一种由 Google 开发的轻便、高效的结构化数据序列化格式&#xff0c;常用于数据存储或在应用程序之间传输数据。它可以将数据结构&#xff08;如对象、消息&#xff09;转换为字节流&#xff0c;以便在网络上进行传输或存储。 Protobuf序列化基…

M-LAG 技术笔记

M-LAG 简介 M-LAG&#xff08;Multichassis link aggregation&#xff0c;跨设备链路聚合&#xff09;将两台物理设备在聚合层面虚拟成一台设备来实现跨设备链路聚合&#xff0c;从而提供设备级冗余保护和流量负载分担。 M-LAG 基础概念 如 图1-1 所示&#xff0c;Device A …

【政策】正文关键词提取总结

附&#xff1a;样本构建流程&#xff1a; 候选样本圈选&#xff0c;这一步的目的是选出潜在的高质量样本&#xff0c;找到一部分高难度样本&#xff0c;并过滤掉可能的意图不明或无意义数据。样本圈选的方法见下文。 对圈选出的样本随机抽样一小部分进行人工标注。 利用少量的…

Vue3 虚拟列表组件库 virtual-list-vue3 的使用

Vue3 虚拟列表组件库 virtual-list-vue3 的基本使用 分享个人写的一个基于 Vue3 的虚拟列表组件库&#xff0c;欢迎各位来进行使用与给予一些更好的建议&#x1f60a; 概述&#xff1a;该组件组件库用于提供虚拟化列表能力的组件&#xff0c;用于解决展示大量数据渲染时首屏渲…