華爲發放20億元獎金,抗擊美國斷供,獎勵員工加班奮鬥

http://www.codeproject.com/
https://github.com/search?q=asp.net+core
 華爲發放20億元獎金,抗擊美國斷供,獎勵員工加班奮鬥
一個對應一個
一個對應多個。
真泛
https://www.cnblogs.com/wuhuacong/p/11833440.html
https://www.cnblogs.com/cnxkey/
https://www.linuxprobe.com/chapter-02.html
程序員,爲什麼千萬不要重寫代碼?
來源: 100offer  發佈時間: 2019-07-11 18:33  閱讀: 7189 次  推薦: 67   原文鏈接   [收藏]  
  程序員都有一顆工程師的心,所以當他們到一片新的場地想做的第一件事就是,將舊的一切推倒重來。是的,他們決不會滿足於簡單的增量勞動。

  或許這種微妙的心理定位可以解釋:爲什麼程序員進入新項目組後寧願丟掉舊代碼重新寫,也不願意修修補補。他們認爲舊代碼簡直一團糟。

  但是,事實上真是這樣嗎?你之所以認爲舊代碼一團糟,其實是由編程的一個基本定律決定的,那就是:寫代碼容易,讀代碼難。

  爲什麼你覺得舊代碼異常混亂?因爲讀代碼更難。
  這大概就是代碼Reuse難以實現的原因。 這就是你組裏的每個人都喜歡用不同的功能將分割的字符串轉換成一個數組。比起猜測舊的功能是怎樣實現的,重新寫一個自己的功能要簡單和有趣多了。

  作爲這個公理的推論,你可以問問身邊的程序員他們正在奮戰的代碼怎麼樣?「簡直是一塌糊塗!」他們肯定會這樣說。「我簡直想推倒重來!」

  爲什麼認爲代碼這麼糟糕呢?「額,看看這個功能,竟然有兩頁長!完全不知道這些東西爲什麼在這裏!完全不知道這些API是幹什麼的。」他們會這樣回答你。

  曾經,Borland的創始人 Philippe Kahn 當初就是向記者們吹噓:Quattro Pro會比Microsoft Excel要好用得多,因爲它是從頭開始編寫的,全部都是新的源代碼!

  但是,認爲新代碼比舊代碼好簡直就是荒謬。舊代碼是已經運行過的,測試過的。無數的bug在被發現前都上線運行過,發現之後程序員們可能在花了好些日子才修復了這些bug。這種修復可能是一行代碼,也可能是幾個字符,無數的時間和精力都花在了這些bug修復上。

  當你決定拋棄這些舊代碼從零開始的時候,你也丟掉全部前任努力的結果。

  新代碼一定比舊代碼好?NO,重寫可能會帶來更大的風險。
  對技術領導者來說,重寫項目的代碼也是一個異常艱難的決定。因爲從公司層面說,重現代碼甚至會威脅產品的市場競爭力。一旦決定重寫代碼,那麼與競品相比,你可能落後了2~3年——在軟件行業,這時間可夠長的。

  你理想中的新代碼會帶來產品功能的提升▼

  但事實上,即便重寫的新代碼可以實現舊代碼的所有功能和需求,但是爲產品帶來的市場競爭力只有邊際提升。因爲重寫用的新技術、新語言、新框架並沒有給產品帶來質的飛躍。

  更不用說在重寫的漫長過程中可能會遇到一些意外情況,比如:

  1、缺錢:資金鍊的斷裂

  2、缺人:核心程序員離職

  最終導致效果不佳:達不到原產品應有的所有功能和需求,白白浪費了時間和金錢,也丟掉了市場競爭力。

  所以重寫代碼意味着,你在把自己置身於非常危險的境地,可能幾年後你也寫不出比以前更好的代碼。你只是花了一大筆錢把已經存在的代碼又寫了一遍。

  當你覺得眼前的舊代碼很爛時,該怎麼辦?
  你覺得舊代碼寫的很爛,那又怎樣呢?它們已經上線,已經在實際運行中經受住了考驗。所以當你發現前任留下的代碼亂七八糟的時候,不妨冷靜下來,從以下三個方面入手理解代碼、改善代碼:

  1、代碼的結構有問題
  如果一段網絡代碼突然彈出了自己的對話框,應該是UI代碼需要被處理。這些問題可以被解決掉,你要一次次小心地移動代碼,重構,改變接口。還需要一位細心的工程師立馬仔細地檢查這些改變是否有問題,從而不打擾到其他人。事實上,甚至比較大的結構變化也可以不扔掉代碼來完成。

  大牛程序員Joel Spolsky回憶說,曾經在某個項目中,他和他的團隊花了好幾個月重新架構在一點上:把代碼動來動去、清理、創建有意義的基類,並創建了模塊之間的完美接口。但是他們始終非常小心翼翼,並沒有產生新的bug、也沒有丟掉任何舊代碼。

  2、代碼的效率不高
  曾經,Netscape的渲染代碼被傳非常緩慢。但事實上,這隻會影響該項目的一小部分,這部分是你可以優化甚至重寫的。你完全不必重寫全部代碼。優化速度的1%工作量,會讓你獲得99%的爆炸性提高。

  3、代碼寫得很醜
  有些代碼真的寫的很醜,比如Joel曾參與一個項目,開始用下劃線做開始的成員變量約定,但後來改用更標準的「M_」。所以一半的功能用「_」開始,一半用「M」開始,這看起來真的很醜陋。但這個問題5分鐘就能解決,而不用從頭開始寫全部的代碼。

  最後,你要記住,從頭開始再寫一遍並不意味着你會寫出比以前更好的代碼。因爲你沒有參與到上一個版本的創建,所以你其實根本就不算有經驗。一旦你準備推倒重寫,你可能會再犯一遍版本一犯過的錯,甚至會產生更多的新問題。

  面對糟糕的舊代碼,Keep Calm & Carry On !
  在大型商業項目中,推倒重來是非常危險的行爲。當然,如果你是在做實驗,想到新算法可以隨時重寫。

  如果你跳槽、或剛接手一個新項目,面對看上去異常混亂的舊代碼,請冷靜下來,忍住推倒重寫的衝動,想想上面這些經驗之談
界面很好
https://dotblogs.com.tw/
https://www.infoq.cn/article/SK7fJE1ZT0ykjc0_gecs
https://www.zhihu.com/question/29836842
https://www.jdon.com/
https://learnku.com/java
OpenJDK
https://www.geekbang.org/
Discuz!NT中的Redis架構設計
     在之前的Discuz!NT緩存的架構方案中,曾說過Discuz!NT採用了兩級緩存方式,即本地緩存+memcached方式。在近半年多的實際運行環境下,該方案經受住了檢驗。現在爲了提供多樣式的解決方案,我在企業版裏引入了Redis這個目前炙手可熱的緩存架構產品,即將memcached與Redis作爲可選插件方式來提供了最終用戶,儘管目前測試的結果兩者的差異不是很大(毫秒級),但我想多一種選擇對用戶來說也是好的。
https://www.cnblogs.com/cnxkey/category/1328757.html
關閉網站的危險的wscript.shell命令行執
https://www.cnblogs.com/cnxkey/articles/3944461.html
https://docs.microsoft.com/zh-cn/dotnet/

性能PK
https://www.techempower.com/benchmarks/#section=data-r16&hw=ph&test=plaintext

增強web體驗
https://www.nuget.org/
Install-Package RabbitMQ.Client -Version 5.1.2

asp.net(C#)套用模板操作Excel
https://www.cnblogs.com/greatverve/archive/2010/08/19/csharp-excel.html

ASP.NET supports industry standard authentication protocols. Built-in features help protect your apps against cross-site scripting (XSS) and cross-site request forgery (CSRF).

ASP.NET provides a built-in user database with support for multi-factor authentication and external authentication with Google, Twitter, and more.

activemq
mq
在我們所做的各種管理平臺集成項目中,經常會遇到與各子系統之間的數據交換問題,通常我們與這些子系統之間的數據交換都是通過數據庫來進行,或建立中間庫或通過表與表之間進行數據導入導出。這樣做會使子系統之間的耦合性太強,互相之間的影響較大,經常會出現莫名其妙的問題,比如表被鎖死,丟失數據等,導致數據庫管理很難。?

?這就應該用activemq了個各系統都通過mq來處理數據,減小數據可以壓力,與程序的耦合。並且activeMQ運行穩定,效率高,不容易丟失數據,並且內置斷開自動連接機制,開發也方便。?

 //c# 圖片壓縮算法
        private void button1_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog ofd = new OpenFileDialog())
            {
                ofd.Filter = "圖片|*.jpg;*.png;*.gif;*.jpeg;*.bmp";
                if (ofd.ShowDialog() == DialogResult.OK)
                {
                    using (FileStream file = new FileStream(ofd.FileName, FileMode.Open))
                    {
                        var img = CompressionImage(file, 50L);
                        MessageBox.Show(CreateImageFromBytes(AppDomain.CurrentDomain.BaseDirectory + @"\" + Guid.NewGuid().ToString(), img));
                    }

                }
            }
        }

        #region 圖片壓縮
        /// <summary>
        /// Convert Byte[] to Image
        /// </summary>
        /// <param name="buffer"></param>
        /// <returns></returns>
        public static Image BytesToImage(byte[] buffer)
        {
            MemoryStream ms = new MemoryStream(buffer);
            Image image = System.Drawing.Image.FromStream(ms);
            return image;
        }

        /// <summary>
        /// Convert Byte[] to a picture and Store it in file
        /// </summary>
        /// <param name="fileName"></param>
        /// <param name="buffer"></param>
        /// <returns></returns>
        public static string CreateImageFromBytes(string fileName, byte[] buffer)
        {
            string file = fileName;
            Image image = BytesToImage(buffer);
            ImageFormat format = image.RawFormat;
            if (format.Equals(ImageFormat.Jpeg))
            {
                file += ".jpeg";
            }
            else if (format.Equals(ImageFormat.Png))
            {
                file += ".png";
            }
            else if (format.Equals(ImageFormat.Bmp))
            {
                file += ".bmp";
            }
            else if (format.Equals(ImageFormat.Gif))
            {
                file += ".gif";
            }
            else if (format.Equals(ImageFormat.Icon))
            {
                file += ".icon";
            }
            System.IO.FileInfo info = new System.IO.FileInfo(file);
            System.IO.Directory.CreateDirectory(info.Directory.FullName);
            File.WriteAllBytes(file, buffer);
            return file;
        }
        /// <summary>
        /// 壓縮圖片 /// </summary>
        /// <param name="fileStream">圖片流</param>
        /// <param name="quality">壓縮質量0-100之間 數值越大質量越高</param>
        /// <returns></returns>
        private byte[] CompressionImage(Stream fileStream, long quality)
        {
            using (System.Drawing.Image img = System.Drawing.Image.FromStream(fileStream))
            {
                using (Bitmap bitmap = new Bitmap(img))
                {
                    ImageCodecInfo CodecInfo = GetEncoder(img.RawFormat);
                    System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality;
                    EncoderParameters myEncoderParameters = new EncoderParameters(1);
                    EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, quality);
                    myEncoderParameters.Param[0] = myEncoderParameter;
                    using (MemoryStream ms = new MemoryStream())
                    {
                        bitmap.Save(ms, CodecInfo, myEncoderParameters);
                        myEncoderParameters.Dispose();
                        myEncoderParameter.Dispose();
                        return ms.ToArray();
                    }
                }
            }
        }

        private static ImageCodecInfo GetEncoder(ImageFormat format)
        {
            ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
            foreach (ImageCodecInfo codec in codecs)
            {
                if (codec.FormatID == format.Guid)
                { return codec; }
            }
            return null;
        }

        #endregion

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章