很多人只会看看书 抄抄框架 对用合理的技术合理的成本实现没点逼数。知识面窄实践不考虑细节场景。合格的架构师真的很少 一堆无脑微服务的 杀鸡用牛刀的 对技术平滑迁移没概念没规划的 不知道怎么结合当前应用规模合理设计架构的 唉
架构师和程序员其实是两种不同的人,他们的思维方式有本质区别,虽然表面看上去他们都是懂软件技术会编写代码的
架构师很多是从程序员过来的,所以他们可以理解程序员思维,但是反过来就不一定了,程序员大多数不具备架构思维。
我们可以从一行代码开始,想象自己逐渐把镜头拉远,以便有更广阔的视野,可以看到全局。
代码==>函数==>算法==>逻辑==>模块==>框架==>功能==>应用==>产品==>服务==>业务==>企业==>行业==>产业链==>经济体==>人类社会==>星辰大海
每递进一个层次,涉及的规模都要扩大几个数量级
架构师主要工作在模块到应用之间,程序员主要工作在代码和模块之间,应用到产业链是企业家的工作范围,业务到经济体则是金融家资本家的领域,经济体之上是政治家的事情。
架构师首先要有更广阔的视野,能从代码看到经济体,然后再聚焦到模块和应用之间,对下规划代码函数到模块的设计,对上为产品服务提供支撑。
架构师需要的能力主要是设计能力,这里的设计不是指算法逻辑的设计,更不是代码语法函数参数的设计,要解决的问题不是算法精度或者运行性能,而是研发体系的效率,质量和成本。
再次强调,架构设计是用来解决研发体系的效率,质量和成本问题的。
架构师是通过对模块,框架的设计,参与制定研发体系流程,从而获得更高开发效率,更高交付质量和更低研发成本。
大部分人做不了架构师,不是因为他不够聪明勤奋,也不是因为他代码写得不够好不够多,而是因为他的思维方式思考的维度不对,没有建立架构思维,还停留在程序代码思维层次。
我们来看看架构设计师都在干什么?
图形程序员在干什么?
数据搬运程序员,干的是最脏最累的活。
uint32_t PAL_MagicSelectionDialog::transfer_data_co(Co_t::push_type &co_source) { char szDesc[512],*next; int i,j,k; BYTE bColor; auto rgMagicItem = dd->rgMagicItem; auto &g_iCurrentItem = dd->g_iCurrentItem; auto &g_iNumMagic = dd->g_iNumMagic; //must co_source(0); while (true) { dd->wReturn = 0xFFFF; //compute cond_draw_desc printf("data co___00
"); if (gpGlobals->lpObjectDesc) { printf("data co___001
"); dd->cond_draw_desc = true; dd->cond_draw_desc_element = true; } else { printf("data co___002
"); dd->cond_draw_desc = false; } printf("data co___0021
"); co_source(0); if (!dd->cond_draw_desc) { printf("data co___002
"); // Draw the cash amount. //PAL_CreateSingleLineBox(PAL_XY(0, 0), 5, FALSE); dd->curr_text_arg = { PAL_GetWord(CASH_LABEL), PAL_XY(10, 10), 0, FALSE, FALSE }; co_source(0); dd->curr_number_arg = { (int)gpGlobals->dwCash, 6, PAL_XY(49, 14), kNumColorYellow, kNumAlignRight }; co_source(0); // Draw the MP of the selected magic. //PAL_CreateSingleLineBox(PAL_XY(215, 0), 5, FALSE); dd->curr_rle_arg = { PAL_SpriteGetFrame(gpSpriteUI, SPRITENUM_SLASH), PAL_XY(260, 14) }; co_source(0); dd->curr_number_arg = { rgMagicItem[dd->g_iCurrentItem].wMP, 4, PAL_XY(230, 14), kNumColorYellow, kNumAlignRight }; co_source(0); dd->curr_number_arg = { dd->g_wPlayerMP, 4, PAL_XY(265, 14), kNumColorCyan, kNumAlignRight }; co_source(0); } else { printf("data co___003 _draw_desc %d
", dd->cond_draw_desc_element); //dd->cond_draw_desc = true; const char *d = PAL_GetObjectDesc(gpGlobals->lpObjectDesc, rgMagicItem[dd->g_iCurrentItem].wMagic); // Draw the magic description. if (d != NULL){ printf("data co text_draw_desc_element1
"); k = 3; strcpy(szDesc, d); d = szDesc; printf("data co text_draw_desc_element2
"); while (TRUE) { printf("data co text_draw_desc_element3
"); next =const_cast<char*>(strchr(d, '*')) ; if (next != NULL){ *next = ' '; next++; } printf("data co text_draw_desc_element4
"); dd->curr_text_arg = { d, PAL_XY(100, k), DESCTEXT_COLOR, TRUE, FALSE }; co_source(0); //PAL_DrawText(d, PAL_XY(100, k), DESCTEXT_COLOR, TRUE, FALSE); k += 16; if (next == NULL){ break; } d = next; } } dd->cond_draw_desc_element = false; // Draw the MP of the selected magic. co_source(0);// PAL_CreateSingleLineBox(PAL_XY(0, 0), 5, FALSE); printf("data draw rle 00000000000000000000000000000000000000001
"); dd->curr_rle_arg = { PAL_SpriteGetFrame(gpSpriteUI, SPRITENUM_SLASH), PAL_XY(45, 14) }; co_source(0); printf("data draw num 00000000000000000000000000000000000000000012 %d %d
", dd->g_iCurrentItem,rgMagicItem[dd->g_iCurrentItem].wMP); dd->curr_number_arg = { rgMagicItem[dd->g_iCurrentItem].wMP, 4, PAL_XY(15, 14), kNumColorYellow, kNumAlignRight }; co_source(0); printf("data draw num 00000000000000000000000000000000000000000013 dd->g_wPlayerMP=%d
", dd->g_wPlayerMP); dd->curr_number_arg = { dd->g_wPlayerMP, 4, PAL_XY(50, 14), kNumColorCyan, kNumAlignRight }; co_source(0); dd->cond_draw_desc = false; //old stop == new start } //dd->cond_draw_all_item_text------------------------------------------------------------------ i = g_iCurrentItem / 3 * 3 - 3 * 2; if (i < 0) i = 0; printf("data co___004 i= %d ,g_iNumMagic=%d
",i, g_iNumMagic); for (j = 0; j < 5; j++) { for (k = 0; k < 3; k++) { //--select menu item color----------------------------------------------- bColor = MENUITEM_COLOR; if (i >= g_iNumMagic){ // End of the list reached j = 5; break; } if (i == g_iCurrentItem){ if (rgMagicItem[i].fEnabled) { bColor = MENUITEM_COLOR_SELECTED; } else { bColor = MENUITEM_COLOR_SELECTED_INACTIVE; } } else if (!rgMagicItem[i].fEnabled) { bColor = MENUITEM_COLOR_INACTIVE; } //----select menu item color--------------------------------------------- // // Draw the text // printf("data co___0041
"); dd->curr_text_arg = { PAL_GetWord(rgMagicItem[i].wMagic),PAL_XY(35 + k * 87, 54 + j * 18), bColor, TRUE, FALSE }; co_source(0); //PAL_DrawText(PAL_GetWord(rgMagicItem[i].wMagic),PAL_XY(35 + k * 87, 54 + j * 18), bColor, TRUE, FALSE); // // Draw the cursor on the current selected item // if (i == g_iCurrentItem) { printf("data co___0042
"); dd->cond_draw_current_item = true; dd->curr_rle_arg = { PAL_SpriteGetFrame(gpSpriteUI, SPRITENUM_CURSOR), PAL_XY(60 + k * 87, 64 + j * 18) }; co_source(0); //PAL_RLEBlitToSurface(); } dd->cond_draw_current_item = false; i++; } } dd->cond_draw_all_item_text = false; //old stop == new start printf("data co___005
"); if (g_InputState.dwKeyPress & kKeySearch) { printf("data co___0051
"); if (rgMagicItem[g_iCurrentItem].fEnabled) { printf("data co___0052
"); dd->cond_draw_select_and_return = true; j = g_iCurrentItem % 3; k = (g_iCurrentItem < 3 * 2) ? (g_iCurrentItem / 3) : 2; j = 35 + j * 87; k = 54 + k * 18; dd->curr_text_arg = { PAL_GetWord(rgMagicItem[g_iCurrentItem].wMagic), PAL_XY(j, k), MENUITEM_COLOR_CONFIRMED, FALSE, TRUE }; co_source(0); //draw dd->wReturn = rgMagicItem[g_iCurrentItem].wMagic; //return rgMagicItem[g_iCurrentItem].wMagic; } } printf("data co___006
"); co_source(0);//return } }
每个人都是在实践中长大的,做领导的会慢慢地做更高级的架构,而专业程序员,就只能在所在专业做到细分极限了。
这部分代码是用我协程把sdlpal的代码 翻译了一下。
觉得有启发的话,可以点个赞。 毕竟看的人少。想要了解更多c++和 协程思想。可以关注一下我的专栏。
协程思想,将是次世代改变程序员命运的法宝。不学就是青春饭,学了,越老越吃香
感觉主要因为技能点并不是十分一致。
架构要脱离了太具体的细节看整体的结构和权衡,跟执行层的软件工程师有交叉的地方,但是视角,思维方式和关注点都完全不一样。
架构师对具体的技术细节不需要了解的太深,但是需要对整体有把握,需要对软件有比较深刻的宏观理解,对各种技术都有涉足,还要懂怎么跟人沟通,把具体的技术细节和宏观结构,策略都联系在一起。
本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度,google,bing,sogou 等
© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有