我国程序员数量突破 940 万,开源参与者增速全球最快

大家好,我是苍何。

就在上个月的 20 号,在武汉举行了「2024开放原子开发者大会」,会上工业和信息化部负责人宣布了一项重要数据:

我国软件开发者群体规模已历史性突破940万大关,其中武汉地区有40万。

而且在开源上,我国已经成为全球开源参与者数量第二多的国家,其增长速度更是全球第一。

好家伙,940 万什么概念?白俄罗斯一整个国家的人口也才约 915 万。

这个数据可谓是相当的庞大,统计口径就得先明确什么是软件开发者?我问了下 AI,他给的解释是:

软件开发者(Software Developer)是指那些从事软件开发工作的专业人士。他们的主要职责是编写、测试、维护和更新计算机程序和应用程序。

这 940 万中有 Java 开发、安卓开发、IOS 开发、C++开发、前端开发等等,种类很多。

我们再来看看全球开发者数量有多少呢?按照 Evans Data Corporation 预测统计,2024 年全球开发者预计 2870 万。

按照换算的话,940 万占据了约全球的 32.75%。

当然了,这种计算方式没有意义,因为两者的统计口径会有出入。

你以为这个数据就已经很多了,但我估计 2025 之后这个数据会更多,为什么呢?因为新的程序员即将来临。

他们或许是不写代码的产品经理,或许是只会写小说的小说家,又或许是路边摆摊的大爷。

用上了 AI 后,人人都变得会设计 APP,开发网站,他们甚至不用写一行代码也能成为新时代的程序员。

我记得前段时间很火的产品经理花生,通过一个简单的不能再简单的 APP 一度爆火。

很多程序员,技术大佬,觉得就这么简单的产品有什么好吹牛的。

但恰恰相反,人家抓住了用户痛点和需求,借助 AI,上线产品,满足了很多人的需求。

所以,理论上,我们也应该把花生这样的产品经理也算是程序员,

未来,程序员不一定只会写代码,只会写代码的不一定是程序员。

我的读者中也有很多的程序员,在 AI 来临的时候,外界都在高喊,AI 第一个要革的就是程序员的命,很多人和我反馈说:

不可能。我有经验,我不可能会被取代。

现在的 AI 编程能商业化落地一整个项目的几乎没有,大部分还在起到辅助的作用,所以很多人认为短期内,取代程序员不大现实。

但现在没有,并不代表未来没有。

我很喜欢罗振宇老师今年跨年演讲中引用任总的这么一段话:

蓝军存在于方方面面,内部的任何方面都有蓝军。在你的思想里面也有红蓝对决,我认为人的一生中从来都是红蓝对决的。

什么意思呢?从企业的角度来看,我们需要成立专门的「蓝军」团队,专门来想办法干倒这家公司,发现存在的不足和问题。

于个人而言,我认为更需要蓝军。你看似引以为傲的技术技能,你曾经引以为傲的大厂光环,这些在 AI 时代下,都可能颠覆你的认知,他们或许都将被取代。

我们需要在思想层面组建蓝军,先去各种体验 AI,去想办法为我们提效,想办法去替代我们现在的工作。

自己先革自己的命,总比哪天别人革你的命好吧。

好啦,又说多了,一点小小的认知,如果和你想法有出入,欢迎评论区讨论,不许锤我,长得好看也不行🐶

回归主题。

今天来一道简单的面试算法题,给枯燥的牛马生活加加油😂。

《RocketMQ 从入门到精通》 原创电子书免费下载(面试必背)面试官看了就喜欢的简历模板免费下载!PmHub-开源项目-助你拿个好 offer。

题目描述

平台:LeetCode

题号:3

题目描述:无重复字符的最长子串

给定一个字符串 s,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: s = "abcabcbb"

输出: 3

解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: s = "bbbbb"

输出: 1

解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: s = "pwwkew"

输出: 3

解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。

请注意,你的答案必须是 **子串** 的长度,"pwke" 是一个子序列,不是子串。

提示:

0≤s.length≤5×1040 \leq s.\text{length} \leq 5 \times 10^4ss 由英文字母、数字、符号和空格组成。

解题思路

这个问题可以用 滑动窗口 技巧来解决:

定义滑动窗口:

窗口是一个动态范围,初始时窗口为空。我们用两个指针 left 和 right 来表示窗口的左右边界。 维护窗口内的无重复字符:

用一个哈希集合(set)存储当前窗口内的字符。如果遇到重复字符,就移动 left 缩小窗口,直到窗口中不再有重复字符。 更新结果:

每次移动 right 扩大窗口时,检查当前窗口的长度是否大于之前的最大长度,并更新结果。 复杂度分析:

时间复杂度:O(n)O(n),每个字符最多被访问两次(一次由 right 扩展窗口,一次由 left 缩小窗口)。空间复杂度:O(k)O(k),kk 是字符集的大小(ASCII 字符的数量为 128)。

代码实现

Java 实现

import java.util.HashSet;

public class LongestSubstringWithoutRepeating {

public int lengthOfLongestSubstring(String s) {

HashSet set = new HashSet<>();

int maxLength = 0;

int left = 0;

for (int right = 0; right < s.length(); right++) {

// 如果有重复字符,则移动左指针缩小窗口

while (set.contains(s.charAt(right))) {

set.remove(s.charAt(left));

left++;

}

// 添加当前字符到集合并更新最大长度

set.add(s.charAt(right));

maxLength = Math.max(maxLength, right - left + 1);

}

return maxLength;

}

public static void main(String[] args) {

LongestSubstringWithoutRepeating solution = new LongestSubstringWithoutRepeating();

System.out.println(solution.lengthOfLongestSubstring("abcabcbb")); // 输出: 3

System.out.println(solution.lengthOfLongestSubstring("bbbbb")); // 输出: 1

System.out.println(solution.lengthOfLongestSubstring("pwwkew")); // 输出: 3

}

}

C++ 实现

#include

#include

#include

using namespace std;

class Solution {

public:

int lengthOfLongestSubstring(string s) {

unordered_set charSet;

int maxLength = 0;

int left = 0;

for (int right = 0; right < s.size(); right++) {

// 如果遇到重复字符,缩小窗口

while (charSet.find(s[right]) != charSet.end()) {

charSet.erase(s[left]);

left++;

}

// 将当前字符加入集合并更新最大长度

charSet.insert(s[right]);

maxLength = max(maxLength, right - left + 1);

}

return maxLength;

}

};

int main() {

Solution solution;

cout << solution.lengthOfLongestSubstring("abcabcbb") << endl; // 输出: 3

cout << solution.lengthOfLongestSubstring("bbbbb") << endl; // 输出: 1

cout << solution.lengthOfLongestSubstring("pwwkew") << endl; // 输出: 3

return 0;

}

Python 实现

def length_of_longest_substring(s: str) -> int:

char_set = set()

max_length = 0

left = 0

for right in range(len(s)):

# 如果有重复字符,缩小窗口

while s[right] in char_set:

char_set.remove(s[left])

left += 1

# 将当前字符加入集合并更新最大长度

char_set.add(s[right])

max_length = max(max_length, right - left + 1)

return max_length

# 测试

print(length_of_longest_substring("abcabcbb")) # 输出: 3

print(length_of_longest_substring("bbbbb")) # 输出: 1

print(length_of_longest_substring("pwwkew")) # 输出: 3

复杂度

时间复杂度: O(n)O(n)空间复杂度: O(k)O(k),其中 kk 是字符集大小(最多 128 个字符)。

ending

一个人可以走得很快,但一群人才能走得更远。苍何的编程星球已经有 6800 多名球友加入了,如果你也需要一个优质的学习环境,戳链接 🔗 加入我们吧。这是一个 编程学习指南 + Java 项目实战 + LeetCode 刷题 + 简历精修 的私密圈子,你可以阅读星球专栏、向苍何提问、帮你制定学习计划、和球友一起打卡成长。

两个置顶帖「球友必看」和「知识图谱」里已经沉淀了非常多优质的学习资源,相信能帮助你走的更快、更稳、更远。

微服务实战项目 PmHub 上线啦 ✌️

欢迎点击左下角阅读原文了解苍何的编程星球,这可能是你学习求职路上最有含金量的一次点击。

最后,把苍何的座右铭送给大家:我举手向苍穹,并非一定摘到星月,只是想保持这个永不屈服的姿势。共勉 💪。

更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地 🎉🎉