大模型时代,程序员的工作还是“写程序”?

简介: 大规模模型时代的到来可能会从根本上改变现状。程序员可以通过市面上的大模型工具在短短的几个月时间内就轻松地掌握了不同的前端框架(基于TypeScript),了解了机器学习算法,云原生基础设施,并学习了各种组件和框架的使用。语言、框架和基础设施的经验似乎已经不再那么重要了。全栈曾经是一个非常遥远的目标,今天已经变得非常容易实现。

过去,作为一名程序员的职责非常明确,具备对计算机和软件基本原理的掌握,至少掌握一门编程语言,了解若干流行的框架,编写和调试代码,确保应用程序正常运行,你就可以称为一名合格的程序员了。

然而,真正专业的“程序员”并不仅仅局限于这一点。

由于软件的长期维护特性和天生的复杂性,编写高效、高质量且易于长期维护的软件非常具有挑战性。因此,对于一名“软件工程师”来说,拥有诸如编写高内聚、低耦合的代码、掌握演进式设计等专业能力是尤为重要的要求。

坦率地说,现在的许多程序员未必能够达到成为“专业”程序员所需的水平。然而,由于软件行业对人才的需求非常大,所以并不过于在意他们是否非常专业。

大规模模型时代的到来可能会从根本上改变现状。程序员可以通过市面上的大模型工具在短短的几个月时间内就轻松地掌握了不同的前端框架(基于TypeScript),了解了机器学习算法,云原生基础设施,并学习了各种组件和框架的使用。语言、框架和基础设施的经验似乎已经不再那么重要了。全栈曾经是一个非常遥远的目标,今天已经变得非常容易实现。

随着大型模型时代的到来,程序员的工作效率也得到了本质的提高。以飞算SoFlu软件机器人推出的专注Java生成AI函数的FuncGPT(慧函数)为例,支持所有类型函数创建。通过自然语言描述Java函数需求,实时生成高质量、高可读性、拿来即用的Java函数代码。生成代码可直接复制到IDEA,或一键导入Java全自动开发工具函数库,满足程序员不同的使用场景。

像FuncGPT(慧函数)这类代码生成器的到来,让程序员从日常简单重复的“写代码”中抽离出来,原来需要花费 80% 的编码时间,交给 AI 工具来完成,解放自己能够更加专注于 20% 的工作,站在更高的角度思考诸如需求分析、技术设计等问题,从“程序员”变成“架构师”,从“写代码”变成“设计程序”,彻底释放每个开发者的创新潜能。

那么大模型时代,什么才是“软件工程师”的真正能力
1、 需求分析能力
需求分析其实从来就是一个极度重要的问题。需求分析从澄清业务目标、到设计需求方案,到明确业务规则,都需要非常结构化的方法。其中目标的定义和特定业务是目前AI无法解决的,也是一位优秀的产品经理的价值所在。大模型的出现,软件开发的生产力大幅上升,全栈已经可以不仅仅是技术域的全栈了,而是可以向前延伸到需求和业务领域的全栈。这也意味着如果你想成为一名优秀的开发工程师,那么你的机会来了!
2、 领域模型
领域模型作为软件开发领域非常关键但却最容易被忽略的。领域模型反映了一个领域中的关键概念及其之间的关系,是我们对现实世界的简化和思维映射,其实也是对布鲁克斯关于软件开发的本质复杂性的直接回应。没有好的领域模型,软件开发势必是混乱的。在大型模型时代,软件开发必然会加速,因此人类和AI需要有效协作。在这种情况下,利用领域模型将成为提高效率的重要因素。
3、 模块化、接口和契约
对于大规模程序,我们往往选择将复杂的问题分而治之。分解后的小问题具有高内聚低耦合特性,明确了它们之间的边界,逐一解决。通过模块化,我们可以复用之前已完成的工作,提高效率,避免重复劳动。在人工智能的时代,模块化变得更加重要,这也是诸如FuncGPT(慧函数)这类代码生成工具出现的意义所在。当让,想让AI更好的帮助我们做好模块化,仍然需要人类工程师的指导和协作。
4、 演进式设计,问题不变,方式值得重新思考
可变更性是软件的根本特征,持续演进能力,正如自然界的进化一样,都是本质。
自动化测试:自动化测试的重要性不会降低,因为它是一种确保契约的方式。
测试驱动开发:经典的测试驱动开发方法可能会有一些变化。可能的转变方向之一是人类使用测试来表达契约,然后由人工智能来负责实现。
结对编程:如果你以前认同结对编程的思想并熟悉结对编程的技巧,现在的你将如鱼得水,因为你有了一个“知识渊博”的编程伙伴。
持续集成:持续集成的重要性日益凸显。
整洁代码:软件开发入门级实践——整洁代码,因为AI代码工具的出现可能已不再是必要的了,因为目前的技术已经能够很好的满足这方面的需求。还是以FuncgptGPT(慧函数)生成的“List排序函数”为例:

// 类名:ListSorter
// 函数名:sortList
// 函数功能:对List进行排序
// POM依赖包:
// <dependency>
//     <groupId>org.apache.commons</groupId>
//     <artifactId>commons-lang3</artifactId>
//     <version>3.12.0</version>
// </dependency>

import org.apache.commons.lang3.StringUtils;

import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;

public class ListSorter {
    /**
     * 对List进行排序
     * @param list List对象
     * @param columns 排序字段名,以/分隔
     * @param order 排序类别,asc顺序,desc倒序
     * @return 排序后的List对象
     */
    public static List<Map<String, Object>> sortList(List<Map<String, Object>> list, String columns, String order) {
        String[] columnArray = columns.split("/");
        for (String column : columnArray) {
            if (StringUtils.isNotBlank(column)) {
                Comparator<Map<String, Object>> comparator = (o1, o2) -> {
                    Object value1 = o1.get(column);
                    Object value2 = o2.get(column);
                    if (value1 instanceof Comparable && value2 instanceof Comparable) {
                        int compareResult = ((Comparable) value1).compareTo(value2);
                        return order.equalsIgnoreCase("asc") ? compareResult : -compareResult;
                    }
                    return 0;
                };
                Collections.sort(list, comparator);
            }
        }
        return list;
    }
}

// 函数示例
// 对List进行排序示例
// 入参:list,List对象
//       columns,排序字段名,以/分隔
//       order,排序类别,asc顺序,desc倒序
// 出参:sortedList,排序后的List对象
// 调用示例:
// List<Map<String, Object>> list = new ArrayList<>();
// Map<String, Object> map1 = new HashMap<>();
// map1.put("name", "John");
// map1.put("age", 25);
// Map<String, Object> map2 = new HashMap<>();
// map2.put("name", "Alice");
// map2.put("age", 30);
// list.add(map1);
// list.add(map2);
// String columns = "name/age";
// String order = "asc";
// List<Map<String, Object>> sortedList = ListSorter.sortList(list, columns, order);
// System.out.println(sortedList);
// 输出结果:例如,按照name字段升序排序,age字段升序排序,排序后的List为:[{name=Alice, age=30}, {name=John, age=25}]
// 则输出结果为:[{name=Alice, age=30}, {name=John, age=25}]

针对代码的整洁性来分析,不难发现:
1、代码的注释非常完整,每个步骤都进行了详细的解释,这有助于读者理解代码的功能和实现方式。
2、代码的缩进和排版都很规范,易于阅读。
3、使用的类和接口都是Java的标准库,这保证了代码的稳定性和可维护性。
4、使用了Apache Commons Lang库,这使得代码更加高效和简洁。
5、代码的功能很清晰,可以对一个List进行排序,并且支持多个排序字段和不同的排序方式。
6、使用了静态方法,这使得代码更加灵活和可重用。
7、使用了lambda表达式,这使得代码更加简洁和易于理解。
8、对于不可比较的对象,代码返回0,这不会影响排序结果,同时也避免了NullPointerException。

如想解锁更多复杂函数需求,免费下载使用 FuncGPT(慧函数):https://a.d4t.cn/pjmYRU。

相关文章
|
2月前
|
设计模式 算法 程序员
程序员为何需要反复修改Bug?探寻代码编写中的挑战与现实
作为开发者,我们在日常开发过程中,往往会遇到反复修改bug的情况,而且不能一次性把代码写的完美无瑕,其实开发项目是一项复杂而富有挑战性的任务,即使经验丰富的程序员也难以在一次性编写完美无瑕地完成代码,我个人觉得一次性写好代码是不可能完成的事情。虽然在设计之初已经尽力思考全面,并在实际操作中力求精确,但程序员仍然需要花费大量时间和精力来调试和修复Bug。那么本文就来分享程序员需要反复修改Bug的原因,以及在开发中所面临的复杂性与挑战。
42 1
程序员为何需要反复修改Bug?探寻代码编写中的挑战与现实
|
8月前
|
数据采集 数据可视化 数据格式
ChatGPT 代码解释器:它如何节省我的工作时间
ChatGPT 代码解释器:它如何节省我的工作时间
|
消息中间件 敏捷开发 JavaScript
为什么说程序员是一个极度劳累的工作?
为什么说程序员是一个极度劳累的工作?
|
程序员 数据安全/隐私保护