WEB领域是不是黄了还是没黄

news/2024/9/28 21:54:23/

进入2024年后,WEB领域大批老表失业,一片哀嚎,个个饿的鬼叫狼嚎,为啥呢,下面是我个人的见解和看法。

中国程序员在应用层的集中

  1. 市场需求:中国的互联网行业在过去几年中经历了爆炸性增长,尤其是在电子商务、社交网络、移动支付等领域。这些领域的快速发展催生了大量对应用层开发的需求,因此许多中国程序员专注于使用现成的框架和技术来快速构建应用程序。

  2. 企业需求:许多中国企业更注重短期收益和市场占有率,因此更加倾向于快速迭代产品和服务,而不是投入大量资源进行底层技术的研发。这导致了很多程序员的工作集中在业务逻辑实现上,即CRUD操作。

  3. 教育和培训:中国的高等教育和职业培训机构往往更侧重于教授实用技能,以便学生能够迅速就业。这种倾向可能导致更多人学习如何使用现有工具和框架,而不是深入研究底层原理。

国外程序员的优势

  1. 历史积累:许多基础技术和框架起源于国外,特别是美国和欧洲。这些国家和地区在计算机科学和软件工程领域有着悠久的历史,积累了大量的经验和知识。

  2. 开源文化:西方国家拥有浓厚的开源文化,许多优秀的开源项目都是由国外开发者发起并维护的。这种文化鼓励技术创新和共享,使得国外程序员更容易参与到核心技术的开发中。

  3. 国际化视野:英语作为国际通用语言,为国外程序员提供了更多的交流机会和获取最新信息的途径。他们可以更方便地参与国际会议、阅读英文文档和教程,从而保持在技术前沿。

  4. 资金支持:一些大型科技公司如Google、Microsoft、Oracle等,在技术研发上有巨大的投入。这些公司在推动技术进步的同时,也为程序员提供了良好的工作环境和发展平台。

    英语的优势

  5. 国际交流:英语是国际科技会议、论坛和开源社区的主要交流语言。掌握英语可以帮助程序员更好地参与这些活动,从而获取最新的技术和行业动态。

  6. 文档与资源:很多高质量的技术文档、教程和在线课程都是英文的。能够无障碍阅读这些资料有助于程序员更快地学习新技术。

  7. 全球就业机会:对于那些希望在全球范围内寻找工作机会的程序员来说,良好的英语能力可以打开更多大门。

国内程序员和国外程序员面对的环境问题

  1. 劳动力市场结构:在一些发达国家,如美国,IT行业的发展更为成熟,企业对于技术人才的需求稳定且持续增长。同时,这些国家的教育体系和职业培训机制往往能够较好地与市场需求对接,培养出符合行业需求的人才。

  2. 法律法规保护:西方国家通常有更完善的劳动法律体系来保护员工权益,比如解雇程序较为复杂,需要给出正当理由,并提供相应的补偿。这使得企业在裁员时会更加谨慎。

  3. 社会保障体系:很多西方国家拥有完善的社会保障网络,包括失业保险、再就业培训等服务,为失业人员提供了更多的缓冲和支持,帮助他们更快地重返工作岗位。

  4. 工会力量:在某些国家,工会的力量较强,可以代表员工与雇主谈判,确保员工获得更好的工作条件和待遇,同时也减少了无故解雇的情况。

  5. 企业文化差异:西方国家的企业文化可能更注重员工的工作生活平衡,较少出现长时间加班的现象,这样的环境有助于保持员工的工作热情和创造力,从而减少因过度劳累导致的职业倦怠或离职。

  6. 技能更新和终身学习:在一些发达国家,企业和政府都鼓励并支持员工进行持续的学习和个人发展,以便适应不断变化的技术环境。这种对个人成长的投资可以帮助程序员保持竞争力,降低失业风险。

  7. 国际化视野:由于英语作为国际通用语言的优势,西方国家的程序员更容易参与全球项目,接触到国际市场的机会也更多,这增加了他们的就业机会。

  8. 创新和技术领先地位:一些发达国家在技术创新方面处于领先地位,这意味着它们有更多的高薪岗位和高级职位,这些职位往往更能抵御经济波动的影响。

  9. 经济稳定性:虽然全球经济都有周期性的波动,但是一些发达国家的经济相对稳定,即使在经济不景气的时候,也能通过各种政策措施来缓解失业问题。

图片

图片

国内大批程序员高度集中在应用层居多,在应用层框架和语法使用者居多,加上环境的影响往往比较重视快,加班,而专研做底层的往往很少,比如一个JAVA开发,springboot ,idea intellij ,open jdk,oracle jdk都是老外在占据并且主导整个全球市场,面对全球用户,而国内的java表们往往是应用层多,还受环境污染,觉得JAVA牛逼=我牛逼的思想腐蚀,PHP垃圾=他也垃圾的影响,相反参与研发open jdk,idea,spring全家桶的JAVA程序员很少,在这种环境下经济波动一影响,往往饿饭,跟我一样捡垃圾过日子。

而国外程序员往往深耕某领域比较深入,也都是几十年的经验,就算只玩应用层框架,也都无的风声水起,比如php。

图片

图片

还获得了几千万支持。

图片

他们的土壤和环境要比国内好很多,在国内PHP早就啥也不是了,但国外人家就玩的一套一套的。

同时国外的商业软件环境也非常好,这些商业软件都需要数学,物理,化学,电力,通信,机械,电子,化工等等专业知识来实现的商业软件,下面看看吧,下以商业软件大部分都是来源于加拿大公司的商业软件,其中国内不少大型单位还是他们公司的客户购买他们的商业软件和服务。

电力实时仿真系统

图片

https://www.opal-rt.com/zh-hans/software-rt-lab/

数字仿真器

图片

图片

https://www.opal-rt.com/zh-hans/systems-hypersim/

图片

图片

这家公司的客户

图片

这家公司的产品

图片

领先的电力系统分析工具

图片

https://www.dsatools.com/

这家公司的客户:浙江大学,太原理工大学,中国易核电力工程有限公司

https://www.dsatools.com/news/

图片

图片

https://www.dsatools.com/partners/

电磁设备提供设计和建模软件

https://www.infologicdesign.co.uk/

图片

图片

Maple数学软件

图片

图片

图片

https://cn.maplesoft.com/products/Maple/features/

图片

图片

图片

图片

图片

图片

图片

图片

全球强大的电影特效软件产品

https://www.sidefx.com/tutorials/

图片

https://www.meetup.com/pro/houdini/

他们公司的招聘

图片

https://www.sidefx.com/careers/

土木、采矿和岩土工程2D 3D 软件

https://www.rocscience.com/software

图片

图片

图片

图片

防真软件

图片

图片

图片

https://www.simscale.com/

世界领先的接地,雷击和电磁干扰分析技术

https://www.sestech.com/zh/Home/About

图片

他们公司的客户

图片

图片

图片

图片

图片

图片

https://www.sestech.com/zh/Training/CertifiedUsersList

图片

QNX系统

https://blackberry.qnx.com/en/industries/industrial-control

图片

QNX的应用范围极广,包含了:控制保时捷跑车的音乐和媒体功能、福特汽车的SYNC 3车载系统、核电站和美国陆军无人驾驶Crusher坦克的控制系统,还有BlackBerry PlayBook和操作系统。[2]

图片

此系统的应用领域

图片

BlackBerry QNX® 是值得信赖的商用操作系统、虚拟机管理程序、开发工具、支持和服务供应商,所有产品均专为全球最关键的嵌入式系统而构建。®BlackBerry QNX 可帮助客户简化开发工作,更高效地推出安全可靠的系统。我们的技术受到超过 2.35 亿辆汽车的信赖,并部署在全球各行各业的嵌入式系统中,包括航空航天和国防、汽车、商用车辆、重型机械、工业控制、医疗、铁路和机器人。BlackBerry QNX 成立于 1980 年,总部位于加拿大渥太华,并于 2010 年被 BlackBerry 收购。

此系统的客户https://blackberry.qnx.com/en/partners/blackberry-qnx-partners

图片

此系统的应用开发

https://www.qnx.com/developers/docs/8.0/com.qnx.doc.neutrino.prog/topic/process_Sample_using_wait.html

图片

/*  * waitchild.c * * This is an example of a parent process that creates some child * processes and then waits for them to terminate. The waiting is * done using wait(). When a child process terminates, the * wait() function returns.*/
#include <spawn.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/wait.h>
main(int argc, char **argv){    char                *args[] = { "child", NULL };    int                 i, status;    pid_t               pid;    struct inheritance  inherit;
    // create 3 child processes    for (i = 0; i < 3; i++) {        inherit.flags = 0;        if ((pid = spawn("child", 0, NULL, &inherit, args, environ)) == -1)            perror("spawn() failed");        else            printf("spawned child, pid = %d\n", pid);    }
    while (1) {        if ((pid = wait(&status)) == -1) {            perror("wait() failed (no more child processes?)");            exit(EXIT_FAILURE);        }        printf("a child terminated, pid = %d\n", pid);                if (WIFEXITED(status)) {            printf("child terminated normally, exit status = %d\n",                WEXITSTATUS(status));        } else if (WIFSIGNALED(status)) {            printf("child terminated abnormally by signal = %X\n",                WTERMSIG(status));        } // else see documentation for wait() for more macros    }}
#include <stdio.h>#include <stdlib.h>#include <pthread.h>
void*  function( void*  arg ){   printf( "This is thread %d\n", pthread_self() );   return( 0 );}
int main( void ){   pthread_attr_t attr;
   pthread_attr_init( &attr );   pthread_attr_setdetachstate(      &attr, PTHREAD_CREATE_DETACHED );   pthread_create( NULL, &attr, &function, NULL );
   /* Allow threads to run for 60 seconds. */   sleep( 60 );   return EXIT_SUCCESS;}
#include <stdio.h>#include <fcntl.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <stdlib.h>
char buffer[] = { "A text record to be written" };
int main( void ){    int  fd;    int  size_written;
    /* open a file for output          */    /* replace existing file if it exists */    fd = creat( "myfile.dat", S_IRUSR | S_IWUSR );
    /* write the text              */    size_written = write( fd, buffer,              sizeof( buffer ) );
    /* test for error              */    if( size_written != sizeof( buffer ) ) {        perror( "Error writing myfile.dat" );        return EXIT_FAILURE;    }
    /* close the file              */    close( fd );
    return EXIT_SUCCESS;}
#include <string.h>#include <stdio.h>#include <sys/json.h>    typedef struct {    const char *path;    int type;    long long size;} info_t;
typedef struct {    int id;    info_t info;} file_t;
bool extract_file_info(const char *str, file_t *file_info){    json_decoder_t *dec = json_decoder_create();    json_decoder_parse_json_str(dec, str);        // Pre-initialise the structure so that omitted optional fields have default values    memset(file_info, 0, sizeof(*file_info));    file_info->info.type = 1;
    // Extract data from the decoder. One can choose to check each call for success if    // it's important to report precise errors. Alternatively, as is done here, one can     // ignore intermediate errors and just check the final status.    json_decoder_push_object(dec, NULL, false);    json_decoder_get_int(dec, "id", &file_info->id, false);        json_decoder_push_object(dec, "info", false);    json_decoder_get_string(dec, "path", &file_info->info.path, false);    // The 'type' is optional. If not present, the call will fail but will not affect    // the decoder's status. We've initialized the field to the value it should have    // if not present, so it doesn't have to be there.    json_decoder_get_int(dec, "type", &file_info->info.type, true);    // The 'size' is also optional.    json_decoder_get_int_ll(dec, "size", &file_info->info.size, true);
    json_decoder_error_t status = json_decoder_get_status(dec, true);
    // While one might usually use a decoder to decode multiple strings, we just free it    json_decoder_destroy(dec);
    // If everything above has succeeded, json_decoder_get_status() will return     // JSON_DECODER_OK    if ( status != JSON_DECODER_OK ) {        printf("Data extraction failed\n");        return false;    }
    return true;}

虚拟飞机,船舶等模拟器

https://flightsim.to/(这个网站好玩)

图片

飞机及模拟器项目软件

图片

其旗舰产品 VAPS 和 VAPS XT 生成的代码已部署到全球数百架飞机上,我们的嵌入式图形软件已在全球 30 多个主要飞机项目中获得认证。

https://www.presagis.com/en/product/ua-accelerator/

图片

图片

图片

图片

限于篇幅就写这么多了,其中大家应该也看了C/C++编程语言的威力了,比如一个JAVA配套的东西open jdk,oracle jdk,spring全家桶,idea intellij等下面的东西全是欧美程序员在占据并且深耕了多年,形成了极强的技术优势和国际市场,积累了底层C/C++/ASM的经验几十年,在以英语为国际通用语言的优势加持,更容易的触达国际市场,不少公司已经成立了几十年,客户遍布全球,编译器,解释器,IDE,操作系统,芯片,指令集,商业软件,工业科技,航天飞机等全是老外在折腾,在占据主导大份额市场,对于经济波动抵御能力强,毕竟用户是整个全球市场,而国内一堆程序员全挤在小小的应用层里扎堆,只面对国内自已的用户小市场挤来挤去,还搞不过人家,失业饿肚子,跟我一样饿肚子的程序员太多了。

真要真正的搞技术,就要明白应用层目前太挤了,需求跟不上人才供给,最好往下走,先去消化阅读分析github上的大型C/C++项目积累经验,才有可能有机会做上面列举的商业软件,也才有能力去参与老外的开源项目,也才有更多的可能和机会。

图片

图片

欢迎友善讨论和评论。


http://www.ppmy.cn/news/1531633.html

相关文章

计算机视觉中的2D变换:用Python让图像‘动’起来

嘿&#xff0c;小伙伴们&#xff01;今天我们要聊的是计算机视觉中的2D变换——那些能让图像‘动’起来的技术。无论你是初学者还是资深开发者&#xff0c;这篇文章都将带你深入了解2D变换&#xff0c;并通过Python代码实战演示。准备好了吗&#xff1f;让我们开始吧&#xff0…

关于QSizeGrip在ui界面存在布局的情况下的不显示问题

直接重写resizeEvent你会发现&#xff1a;grip并没有显示 void XXXXX::resizeEvent(QResizeEvent *event) {QWidget::resizeEvent(event);this->m_sizeGrip->move(this->width() - this->m_sizeGrip->width() - 3,this->height() - this->m_sizeGrip->…

【FPGA】编程方式

FPGA编程方式 1 什么是PLD&#xff1f;2 什么是颗粒度&#xff1f;3 可编程逻辑器件的编程方式有哪些&#xff1f;3.1 SRAM 编程技术3.2 Flash/EEPROM 编程技术3.3 反熔丝编程技术3.4 编程技术比较 参考资料 1 什么是PLD&#xff1f; 可编程逻辑器件 英文全称为&#xff1a;pr…

Docker部署MongoDB教程

嘿&#xff0c;大家好&#xff01;今天我在三丰云免费服务器上进行了一次激动人心的MongoDB部署测试。这款免费云服务器1核CPU、1G内存、10G硬盘、5M带宽&#xff0c;是不错的免费服务器选择。 首先&#xff0c;让我们简要介绍一下使用到的Docker和MongoDB软件。Docker是一个开…

Apache Iceberg 数据类型参考表

Apache Iceberg 概述-链接 Apache Iceberg 数据类型参考表 数据类型描述实例方法注意事项BOOLEAN布尔类型&#xff0c;表示真或假true, false用于条件判断&#xff0c;例如 WHERE is_active true。确保逻辑条件的正确性。INTEGER32位有符号整数42, -7可用于计算、聚合&#xf…

影刀RPA实战:java结合影刀同步采购订单数据

1.实战目标 本次实战我们用java语言结合影刀&#xff0c;实现从自用ERP系统同步订单到旺店通中&#xff0c;在工作中&#xff0c;有时候我们的运营数据不是直接在旺店通ERP中操作&#xff0c;比如我们有自己的ERP&#xff0c;完成一些特定的内部工作后&#xff0c;再把数据同步…

【Linux】线程同步与互斥

一、线程间互斥 1 .进程线程间的互斥相关概念 临界资源&#xff1a;多线程执行流共享的资源就叫做临界资源 临界区&#xff1a;每个线程内部&#xff0c;访问临界资源的代码&#xff0c;就叫做临界区 互斥&#xff1a;任何时刻&#xff0c;互斥保证有且只有一个执行流进入临界…

多路复用和事件轮询机制

多路复用&#xff1a;Nio 服务端只有一个线程处理多个连接 事件轮询机制&#xff1a;select 底层用了 epoll。 select open 调用了 epoll 通过3个方法来实现事件轮询 1.epoll.create 创建epoll 多个集合 2.epoll.ctl 如果有事件会把事件挪到就绪事件列表。 3.epoll.wait 会监听…