Làm thế nào để bạn duy trì năng suất khi xử lý mã được viết cực kỳ xấu?


63

Tôi không có nhiều kinh nghiệm làm việc trong ngành công nghiệp phần mềm, tự học và đã tham gia vào nguồn mở trước khi quyết định nhận việc. Bây giờ tôi làm việc vì tiền, tôi cũng phải đối phó với một số thứ khó chịu, đó là điều bình thường.

Gần đây tôi được chỉ định thêm ghi nhật ký vào một dự án SharePoint lớn được viết bởi một số lập trình viên rõ ràng đang học cách viết mã trong công việc. Sau 2 năm hợp tác, khách hàng đã chuyển sang công ty chúng tôi, nhưng thiệt hại đã được thực hiện, và bây giờ bằng cách nào đó tôi cần phải duy trì mã này.

Không phải là mã quá khó đọc. Mặc dù có nhiều vấn đề, nhưng mỗi dự án đều có một lớp với một số phương pháp được sao chép, các tổ hợp khổng lồ if, Hệ thống Hungary, các kết nối không bị ràng buộc mà vẫn có thể đọc được.

Tuy nhiên, tôi thấy mình hoàn toàn không có tác dụng mặc dù làm việc trên một cái gì đó đơn giản như thêm đăng nhập. Về cơ bản, tôi chỉ cần đi qua mã từng bước và thêm một số cuộc gọi theo dõi. Tuy nhiên, sự ngu ngốc của mã rất khó chịu đến nỗi tôi cảm thấy mệt mỏi trong vòng 10 phút kể từ khi bắt đầu . Ban đầu, tôi thường thêm các usingcấu trúc, giảm lồng nhau bằng cách đảo ngược if, đổi tên các biến thành tên có thể đọc được nhưng dự án lớn và cuối cùng tôi đã từ bỏ. Tôi biết đây không phải là nhiệm vụ tôi nên làm, nhưng ít nhất việc giảm bớt mớ hỗn độn đã mang lại cho tôi một phần thưởng tâm lý nào đó để tôi có thể tiếp tục. Bây giờ mánh khóe ngừng hoạt động, và tôi vẫn còn 60% công việc phải làm.

Tôi bắt đầu bị đau đầu sau khi làm việc và tôi không còn cảm giác hài lòng mà tôi đã sử dụng để nhận được điều mà thường cho phép tôi viết mã trong 10 giờ liên tục mà vẫn cảm thấy tươi mới.

Đây không chỉ là một câu nói lớn, vì tôi thực sự có một câu hỏi thực sự:

Có cách nào để duy trì năng suất và không phải chiến đấu với cối xay gió không?

Có một số loại lừa tâm lý để tiếp tục tập trung vào các nhiệm vụ, thay vì suy nghĩ “Làm thế nào ngu ngốc được rằng ?” Mỗi khi tôi nhìn thấy một thủ thuật thông minh bởi các lập trình viên trước đó? Vấn đề với việc thêm ghi nhật ký là tôi thực sự phải hiểu mã làm gì và làm như vậy làm tổn thương não của tôi một cách khó chịu.


Ký hiệu tiếng Hungary không tệ, hãy đọc bài báo gốc để xem anh ấy đang nói về điều gì :)
Woot4Moo

14
Tôi biết tiếng Hungary không tệ. Đây chính xác là lý do tại sao tôi viết Hệ thống tiếng Hungary chứ không phải Ứng dụng tiếng Hungary (bản gốc). Tôi thấy không có ý nghĩa trong việc sử dụng Hệ thống Hungary trong C # vì nó có hệ thống và IDE loại tuyệt vời. Có 10 biến trong cùng một phạm vi mà tất cả bắt đầu bằng objlà khó khăn vì về cơ bản nó không thể đọc được.
Dan

2
Tôi ước tôi có thể đưa ra câu hỏi này nhiều hơn một phiếu bầu!
o6tech


9
Tôi thổi bay hơi nước bằng cách hỏi những câu hỏi khó chịu trên stack khiến tôi bị hạ thấp.
Erik Reppen

Câu trả lời:


32

Tôi rất tiếc phải nói với bạn, nhưng không phải tất cả các công việc đều tràn ngập ánh nắng và sự quyến rũ. Phần lớn các nhiệm vụ phát triển liên quan đến công việc vất vả như thế này. Đáng buồn nhưng là sự thật.

Bạn được giao một công việc quan trọng, ngay cả khi nó nhàm chán đến mức xem sơn khô. Điều này quan trọng vì hai lý do: 1. Nó bổ sung rất nhiều đăng nhập cần thiết vào một hệ thống lớn để khi có sự cố xảy ra, bạn sẽ có một công cụ để giúp bạn tìm thấy nó. và 2. Nó giúp bạn làm quen với cơ sở mã để nếu và khi có sự cố xảy ra, bạn có thể nhảy vào và sửa nó.

Bạn đang cơ bản tạo mạng lưới an toàn của riêng bạn ở đây. Sự quyến rũ, không, nhưng quan trọng là có!

Vì vậy, điều đó được nói làm thế nào bạn nên thúc đẩy bản thân? Khi tôi có một nhiệm vụ làm phiền tâm trí trong công việc, tôi đặt mục tiêu cho chính mình. Hoàn thành nhiệm vụ x vào cuối tuần. Nếu tôi thực hiện mục tiêu của mình, tôi tự thưởng cho mình. Nhà hàng mới tôi muốn thử? Đi tối thứ sáu nếu tôi hoàn thành. Phim mới ra mắt? Xem nó vào cuối tuần nếu tôi hoàn thành.

Tôi thấy nói chuyện với người giám sát của mình và cho anh ấy / cô ấy biết tôi đang ở đâu và cách tôi tiến bộ khiến tôi có trách nhiệm. Nếu tôi nói với họ tôi sẽ hoàn thành vào thứ Sáu, tôi cảm thấy có xu hướng hoàn thành nó vào thứ Sáu b / c Tôi đã nói với họ rằng tôi sẽ hoàn thành nó.

Hãy tin rằng một khi bạn hoàn thành nhiệm vụ này và bạn đã hoàn thành tốt công việc, đúng thời gian và ngân sách mà mọi người sẽ chú ý và khi dự án mới sáng chói đó xuất hiện, tên của bạn có thể được đề xuất là người nhận được nó. :)


Tôi đặc biệt thích điểm về động lực thứ sáu. Thật buồn cười khi bản phát hành hiện tại cũng được lên kế hoạch đến thứ Sáu. Tôi nghĩ rằng đáng để thêm động lực lòng biết ơn là một động thái. Bạn cần đảm bảo ai đó sẽ biết ơn công việc của bạn, nếu không sẽ thay đổi những gì bạn đang làm. Chân thành 'cảm ơn bạn thường quay lại hàng giờ không ngừng nghỉ.
Dan

1
@gaearon - Tôi rất vui vì những gợi ý này hữu ích cho bạn. Vượt qua công việc vất vả với một động lực tốt sẽ được đền đáp cuối cùng. Năm ngoái tại công việc hiện tại của tôi, tôi đã phải làm một cái gì đó tương tự như những gì bạn đang làm. Năm nay tôi được tặng một ứng dụng hoàn toàn mới để viết từ đầu. Mọi người sẽ nhận thấy những gì bạn làm và làm việc tốt như thế nào.
Tyanna

3
-1 Tại sao liên kết cuộc sống công việc và cuộc sống cá nhân của bạn? Điều này nghe có vẻ tương tự như việc tăng ca liên tục -I didn't finish my under-estimated task by Friday - so I need to stay at home and feel bad.
Vorac

@Vorac ~ Tôi nói đó là những gì tôi làm để thúc đẩy bản thân. Mọi người đều khác nhau. Và tôi có thể đảm bảo với bạn, tôi không làm việc OT một cách nhất quán. Tìm một cái gì đó thúc đẩy bạn và sử dụng nó. Tôi thấy phần thưởng vật chất hoạt động tốt nhất khi tôi có một nhiệm vụ mà tôi không muốn làm.
Tyanna

1
@IntegrityFirst ~ Đối với tôi, vâng. Tôi sẽ ở lại muộn để hoàn thành danh sách việc cần làm của tôi. Tôi sẽ dành ngân sách thời gian của mình để đảm bảo rằng tôi đạt được nó. Đó là sự chính trực của tôi với bản thân và đồng nghiệp để hoàn thành điều gì đó khi tôi nói rằng tôi sẽ hoàn thành nó. Nhưng, nếu tôi phát hiện ra điều gì đó không thể thực hiện được trong thời gian tôi nói, tôi sẽ thay đổi kế hoạch và cho người giám sát của tôi biết. Và nếu tôi kết thúc muộn một chút, bộ phim / nhà hàng sẽ có mặt vào tuần tới. :)
Tyanna

30

Giữ một tập tin các đoạn mã ứng cử viên để gửi đến thed Dailywtf.com. Ngay cả khi bạn không thực sự có ý định gửi chúng, điều đó mang lại cho bạn một mặt sáng để tìm ra một số mã thậm chí còn tệ hơn mức trung bình.


Tôi ước tôi có thể nâng cấp nó thêm một lần nữa. Nó hóa ra là một gợi ý thực sự tuyệt vời, bây giờ tôi thấy rằng những kẻ này lưu trữ các thay đổi của họ trong các tệp cấu hình ứng dụng, ngay trước khi cài đặt thực tế.
Dan

24

Tôi đã ở trong một tình huống tương tự, được giao nhiệm vụ dọn dẹp một khối lượng lớn mã được viết kém, được sao chép và dán ồ ạt.

Để duy trì động lực và sự tỉnh táo của tôi, tôi đã viết một kịch bản có tên là current_scoređếm LỘC trong dự án (giảm dần, khi tôi loại bỏ trùng lặp và chuyển sang các thuật toán tốt hơn) và so sánh nó với LỘC khi tôi bắt đầu. Bất cứ khi nào tôi cảm thấy nản lòng hoặc thất vọng với hàng núi mã mà tôi đang đối mặt, việc chạy current_scoresẽ mang lại cho tôi cảm giác về sự tiến bộ rõ rệt và sẽ nhắc nhở tôi về việc tôi đã hoàn thành được bao nhiêu. Và thật vui khi thấy số điểm tôi có thể đạt được khi đạt được một phần mã đặc biệt tệ.

Tôi sẽ tìm kiếm các số liệu tương tự mà bạn có thể dễ dàng viết kịch bản để tạo cho mình cảm giác tiến bộ và biến nó thành một trò chơi sắp xếp. Các dòng mã (chỉ chạy wc -l), độ phức tạp theo chu kỳ (sẽ giảm xuống khi bạn dọn sạch các "ifs" khó chịu được lồng vào nhau), các dòng mã đã được bạn chạm vào thay vì người tiền nhiệm của bạn (Tôi nghĩ rằng FishEye có thể cho bạn biết điều này $ 10), v.v. Thậm chí, bạn thậm chí có thể viết một tập lệnh Perl mà không gặp nhiều khó khăn để đếm số khối mã chưa có báo cáo ghi nhật ký.


Tôi sử dụng SourceMonitor
UmNyobe

13

Tôi đã xem cuốn sách này được đề xuất: Làm việc hiệu quả với Bộ luật kế thừa , nhưng may mắn là không có nhu cầu đọc nó.

Giống như bạn đang làm, hãy cấu trúc lại những gì bạn cần để bạn có thể hiểu mã và chỉ cần nhớ rằng bạn đang hồi sinh một hệ thống, sẽ trả hết khi bạn duy trì nó.
Điều đó hy vọng sẽ đặt một mùa xuân trong bước chân của bạn trên đường về nhà.


2
Cuốn sách này là về tái cấu trúc mã hiện có để làm cho nó có thể kiểm tra được; Tôi không nghĩ rằng nó sẽ giúp nhiều trong cách tạo động lực.
Billy ONeal

2
Điểm tốt @Billy ONeal, nhưng có mã kiểm tra và các số liệu liên quan có thể cho thấy sự tiến bộ có thể là động lực.
StuperUser

1
Tôi đã đọc cuốn sách này. Chắc chắn đáng đọc. Tôi thực sự đã tìm thấy WEWLC thúc đẩy chỉ vì thật tuyệt khi biết có ai đó ngoài kia đã hiểu chính xác những nỗi thất vọng mà tôi đang gặp phải và đã nghĩ ra những cách hiệu quả để giảm bớt những sự thất vọng đó.
Jason Swett

1
Cuốn sách đó hơi cũ và lỗi thời. Nếu bạn không đọc nó, tại sao bạn lại giới thiệu nó?
Bовић

1
@StuperUser Khi tôi đọc nó, tôi có thể nói nó đã lỗi thời và có thể cung cấp một số lời khuyên hữu ích cho người dùng mới làm quen.
Bовић

6

Cố gắng phá vỡ các dự án thành khối. Mỗi ngày học cách một khối cụ thể hoạt động. Cố gắng để hiểu tất cả cùng một lúc có lẽ là điều đang làm bạn căng thẳng.

Hãy tự hào làm cho dự án tốt hơn. Có những lập trình viên khác mà bạn có thể nói chuyện? Nó giúp đứng xung quanh máy làm mát nước thảo luận / cười theo logic mới nhất mà bạn tìm thấy. Tôi cố gắng làm điều này để giữ một bầu không khí vui vẻ tại nơi làm việc.


Vâng, tôi đang làm việc theo từng khối, và tôi đã làm việc với nó một thời gian rồi nên tôi có một ý tưởng sơ bộ về từng thành phần. Tuy nhiên, điều đó không giúp được gì nhiều vì đó là những mẩu logic nhỏ thường mất thời gian để hiểu về tôi và tôi tức giận khi nhận ra rằng phương pháp 30 dòng mà tôi đã dành 10 phút trên thực tế có thể được viết lại thành 2 dòng. Thật không may cho công ty, thật không may, tôi là nhà phát triển duy nhất trong dự án này và hiện tôi đang làm việc trong văn phòng của khách hàng nên không có ai tôi thực sự có thể nói chuyện.
Dan

@gaearon - Điều gì ngăn cản bạn thực hiện giải pháp 2 dòng của bạn? Bạn cần tìm ra cách thực hiện những gì bạn được giao nhiệm vụ, vấn đề với mã có thể được giải quyết sau này, khi bạn không ở trong văn phòng của khách hàng. Bạn nên ghi chú lại những gì bạn đã làm, cách thức hoạt động của một cái gì đó để bạn có thể quay lại sau trong tương lai và thực hiện các thay đổi của mình để có thể thực hiện đánh giá mã và kiểm tra tích hợp.
Ramhound

@gaearon ah-ha! Bạn là lập trình viên duy nhất. Vì vậy, người trước bạn là lập trình viên duy nhất. Bạn có thể tránh xa rất nhiều khi bạn là lập trình viên duy nhất (như bạn đã nhận thấy từ người tiền nhiệm). Hãy ghi nhớ điều này khi bạn tìm kiếm công việc tiếp theo. ;)
davidhaskins

@Ramhound Tôi cá là sẽ không có bất kỳ đánh giá mã nào. Tôi cá là sẽ không có bất kỳ thử nghiệm tích hợp chính thức nào. Tôi đã làm việc ở những vị trí này một vài lần. Nói chung mọi người chỉ muốn mã hoạt động đủ tốt và họ muốn nó càng nhanh càng tốt. Giải thích "thực hành tốt nhất" giống như nói chuyện với một bức tường, IMHO.
davidhaskins

@Ramhound, không có thử nghiệm nào cho dự án này và tôi không muốn chịu trách nhiệm cho việc phá hỏng hệ thống vì mã sạch hơn. Có nhiều trường hợp khi mã hiện tại ngụ ý các ngoại lệ bị nuốt hoặc nếu không thì phụ thuộc vào các loại hành vi xấu khác không rõ ràng. Nhân tiện, đây là một trong những lý do tôi thêm đăng nhập.
Dan

6

Ghi chú sâu rộng để sắp xếp các câu hỏi, suy nghĩ và hiểu biết về hệ thống của bạn. Điều này đã làm việc kỳ diệu đối với tôi khi làm việc với các hệ thống di sản lớn. Nó giúp kết tinh sự hiểu biết của bạn, giúp đặt các câu hỏi mở thành lời nói và bởi vì suy nghĩ của bạn đã được đặt cùng nhau, nó giúp bạn dễ dàng giao tiếp với người khác về các vấn đề / câu hỏi / ý tưởng / v.v.

Ví dụ, khi tôi đang trải qua một đoạn mã, tôi sẽ liên tục tự ghi chú. Đây là cuộc trò chuyện của tôi với chính mình. Hành động đơn thuần của văn bản giúp nhiều suy nghĩ xuất hiện và giúp tôi hiểu mọi thứ tốt hơn. Sau một thời gian, tôi có thể có một chiếc Eureka và cần vẽ ra một sơ đồ nhỏ với "bức tranh lớn hơn" trên giấy để minh họa những gì tôi vừa nghĩ hoặc những gì tôi vừa ghép lại. Tôi luôn luôn làm điều này trên giấy tờ, loại bỏ tất cả những phiền nhiễu của máy tính. Điều này cho phép tôi có phương pháp và suy nghĩ sâu sắc hơn về những gì tôi đang làm.

Đây về cơ bản là một cách thuận tiện để có một cuộc trò chuyện vĩnh viễn với một chuyên gia tên miền :)


3

Tôi biết bạn có thể cảm thấy không hiệu quả vì bạn đang xem xét từ góc độ 'Tôi chỉ thêm ghi nhật ký' trong khi thực tế, bạn đang thêm ghi nhật ký và thực hiện nhiều thao tác tái cấu trúc. Người giám sát của bạn có thể nhận thức được tình hình mã. Mọi người có thể không đánh giá cao nó ngay bây giờ, nhưng khi bạn nhận được yêu cầu thêm một tính năng thực sự thú vị và đầy thách thức, bạn sẽ rất vui vì bạn đã dọn sạch mã.


Tôi sợ rằng tôi sẽ kết thúc việc viết lại dự án, chúng tôi đã nói về điều đó. Mặc dù tôi thích tùy chọn này tốt hơn, nhưng nó không tăng năng suất khi làm việc với mã vứt đi. Tôi biết đăng nhập là bắt buộc trong bản phát hành tiếp theo, và sau đó tôi có thể đi với công cụ của mình, nhưng chính việc phải chạy mã này qua đầu tôi khiến tôi phát điên. Tôi cảm thấy như mình trở nên ngu ngốc hơn sau khi hiểu nó :-)
Dan

1
"Nó không tăng năng suất khi làm việc với mã vứt bỏ" Suuure nó làm. Bạn có thể trải qua các phần lớn của mã làm việc theo sự hiểu biết của bạn về nó, trong khi thực hiện một nhiệm vụ rủi ro thấp (ghi nhật ký). Kiến thức bạn đang đạt được sẽ giúp ích rất nhiều nếu được viết lại. Nếu không viết lại, hãy cố gắng trông chờ vào phần thưởng mà bạn sẽ cảm thấy khi bạn dọn sạch số lượng lớn ứng dụng, cơ sở mã sẽ tốt hơn bao nhiêu nhờ những nỗ lực kiên định và bền bỉ của bạn.
quentin-starin

2

Trong những trường hợp này tôi có xu hướng viết lại một phần của mã. Để làm cho một khu vực hút ít hơn và sau đó tôi chỉ cần thêm đăng nhập một số nơi khác. Sau đó dọn sạch thêm một số mã. Mã xấu chỉ xấu nếu bạn để nó ở đó.


Hệ thống phụ thuộc rất nhiều vào các thực tiễn xấu vì vậy để viết lại một phương pháp đúng cách tôi sẽ phải viết lại toàn bộ dự án (điều mà cuối cùng tôi có thể sẽ làm nhưng tôi có một số thời hạn cho bản phát hành hiện tại).
Dan

Tôi hiểu tôi tin tôi. Tôi chỉ chọn ra một phần tôi có thể dọn dẹp khiến cuộc sống của tôi trở nên đau đớn và làm sạch nó và sau đó là khu vực tiếp theo. Sửa mã là một quá trình mà bạn không bao giờ có thời gian nhưng phải luôn dành thời gian cho nó.
Erin

2

Gamify công việc của bạn. Ví dụ, hãy tự cho mình 5 điểm mỗi khi bạn hỏi một câu hỏi hay về mã và 10 điểm mỗi khi bạn trả lời nó. Cung cấp cho mình một huy hiệu mỗi khi bạn cấu trúc lại một phương thức hoặc thêm một tính năng mới. Khi bạn tích lũy đủ điểm, bạn sẽ nhận được các đặc quyền như cà phê hoặc bánh quy. Một khi bạn hoàn thành toàn bộ dự án, bạn có được đặc quyền để đối xử với chính mình với những gì bạn thực sự muốn.


0

Mẹo để không cảm thấy buồn chán hay tức giận để bạn duy trì năng suất là chấp nhận rằng mã được thiết kế kém. Chấp nhận vị trí của bạn để phải hiểu và cập nhật mã sẽ cho phép bạn không tiếp tục nhận xét về "điều đó thật ngu ngốc" và thay vào đó lặng lẽ chấp nhận nó và tiếp tục.

Một mẹo khác là có một người nội trợ tốt để mong đến cuối ngày. Bạn gái, bạn bè, trò chơi bất cứ điều gì cũng sẽ hoạt động, để cung cấp cho bạn một mục tiêu để vượt qua mọi ngày và làm cho việc đi lại mặc dù mã xấu tất cả đều có giá trị trong khi.


0

"Làm việc hiệu quả với Bộ luật kế thừa" của Michael Feathers có thể giúp ích.

Nếu bạn lo lắng về việc phá vỡ mọi thứ khi bạn thay đổi chúng, hãy viết một số bài kiểm tra trước, đảm bảo rằng chúng vượt qua trước và sau khi bạn thực hiện các thay đổi của mình. Viết bài kiểm tra sẽ giúp bạn tóm tắt và hiểu những gì một đoạn mã đã cho và sẽ cho phép bạn chỉnh sửa một cách tự tin.


Thật không may, đó là dự án SharePoint, có nghĩa là nó gần như không thể thực hiện được. Trước đây tôi đã viết một số hộp cát tuyệt vời cho SharePoint bằng Microsoft Moles nhưng nó đòi hỏi rất nhiều công việc bổ sung.
Dan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.