ソフトウェア工学

システム開発ライフサイクル内で働く専門家、学者、学生向けのQ&A

13
候補者にリンクリストの実装を作成させるのは面接の習慣として悪いですか?[閉まっている]
このサイトを読んで、候補者がリンクリストを最初から実装しなければならないと言ったインタビューの質問と回答の多くの物語を見てきました。通常、これはFizzBu​​zzを書くようなロール候補者をプログラミングするための「ギミー」演習です。候補者がこれを行うことができない場合、彼らはプログラムすることができず、ほぼすぐに拒否されるべきであるという考えです。 ただし、次の理由から、これは悪い練習になると思わずにはいられません。 C#やPythonなどの最新の高レベル言語は、ネイティブでリストを広く使用しています。独自のリンクリストオブジェクトの作成は、通常とは異なる状況でのみ必要であり、それでもおそらく不適切です。 C ++のような低レベル言語には、イテレータ/リストコンテナとオブジェクトを備えた標準ライブラリがあります。 最初の2つのポイントに照らして、コーダーはリスト(リンク、二重リンクなど)を実装することさえ考えずに何年も行くことができます。大学時代からそのようなものを見ることさえない人もいます。 コンピューティング能力も数年前の要因ではないため、ポインターを介した効率は以前の問題ではありません(一般的に)。 「リンクリストの例」のような単純なWeb検索では、多くのコード例が表示されますが、それらは暗記し、吐き出すだけで、申請者の真の能力を示すものではありません。 リンクされたリストを使用して、自由回答形式の質問/候補者の問題解決/批判的思考能力の議論につながることは、ほとんどの場合、非常に優れた面接の練習です。面接担当者は、応募者がどのようなもので、どのように考えると非常に有益であるかを実際に見ることができます。 デスクトップまたはWebアプリケーションで作業するプログラマーのための「リンクリストコードも仕事もない」というこのバイナリアプローチは少し時代遅れだと思います。また、非常に有害な場合もあります。リストの先頭で適切に作業する方法を覚えていない候補者は、そうでなければ優れたコーダーおよび同僚であり、ミックスで失われる可能性があります。考え? 編集:これが尋ねるべき良い質問か悪い質問かは、仕事の文脈に依存することを示唆する多くの(良い)コメントがあります。私は強く同意するので、この質問を言い換えてみましょう:リンクリストの実装は、FizzBu​​zzや階乗を計算するための再帰関数を書くような質問に似た、幅広いコーディングジョブの一般的なインタビューの質問です。この質問には、プログラミングの候補を全面的に評価するために一般的に使用するのに十分なユーティリティがありますか?または、「シニア開発者、埋め込みリンクリストチーム」の職を除いて、尋ねるべき悪い質問を検討すべきですか?


7
SQLトリガーと、それらを使用するタイミングまたは使用しないタイミング。
私が元々SQLについて学んでいたとき、私はいつも言われました。本当に必要な場合にのみトリガーを使用し、可能であれば代わりにストアドプロシージャを使用することを選択します。 残念ながら当時(数年前)、私は今ほどファンダメンタルズに興味がなく、その理由を尋ねることはありませんでした。 これに関するコミュニティの意見は何ですか?誰かの個人的な好みなのか、それとも正当な理由がない限り、トリガーは(カーソルのように)避けるべきなのか。
43 sql 

3
「究極のラムダ」というフレーズの起源と意味は何ですか?
私は数年前から関数型プログラミング言語をいじり続けてきましたが、このフレーズに出会っています。たとえば、これは「The Little Schemer」の章であり、これは確かにこの名前でブログに先行します(いいえ、この章は私の質問に答える助けにはなりません。) 私はラムダの意味を理解しています。匿名関数の概念はシンプルかつ強力ですが、このコンテキストで「究極」が何を意味するのか理解できません。 私がこのフレーズを見た場所: The Little Schemerの第8章のタイトル ブログ:http : //lambda-the-ultimate.org/ 一連の「Lambda the ultimate X」ペーパー:http : //library.readscheme.org/page1.html ここに参照がありませんが、誰か助けてもらえますか?

6
パスワードを複数回ハッシュする方が安全ですか?
パスワードを保存するとき、文字列を「ダブルハッシュ」することをお勧めします(たとえば、md5、sha1、両方ともソルトを使用するなど)。 最初の質問は、「これは実際に正しいのですか?」そうでない場合は、この質問の残りを無視してください:) 私が尋ねる理由は、一見すると、これが理にかなっていると言うことです。しかし、それについて考えると、ハッシュが再ハッシュされるたびに(おそらく何かが追加されて)、私が見ることができるのは、最終的な「一意性」の上限が減少していることです...初期入力。 別の言い方をしましょう。ハッシュされたときにy個の可能な文字列に削減されるx個の文字列があります。つまり、最初のセットには衝突があります。今、2番目のセットから3番目のセットに来て、同じことが発生することはできません(つまり、3番目のセットで同じハッシュになるすべての「y」文字列のセットでの衝突)? 私の頭の中では、各ハッシュ関数呼び出しの「ファンネル」、無限の可能性のセットを有限セットに「ファネル化」するなどが見えますが、明らかに各呼び出しはその前の有限セットで動作しており、入力より大きく設定しないでください。 たぶん、例は私のとりとめを説明しますか?「a」と「b」にハッシュ「1」を与え、「c」と「d」にハッシュ「2」を与える「hash_function_a」を取ります。この関数を使用してパスワードを保存すると、パスワードが「a」であっても、パスワード「b」を使用できます。 「1」と「2」にハッシュ「3」を与える「hash_function_b」を取ります。「hash_function_a」の後に「セカンダリハッシュ」として使用する場合、パスワードが「a」であっても「b」、「c」または「d」を使用できます。 それに加えて、ソルトを使用する必要がありますが、「x」入力を「less than x」出力にマッピングするたびに実際に変更されるわけではありません。私はそうは思いません。 誰かが私にここで不足していることを説明してもらえますか? ありがとう! 編集:それが価値があるため、私は自分でこれを行うのではなく、bcryptを使用します。そして、「ハッカー」にとって「サイクルを使い切る」のに役立つかどうかはあまり心配していません。私は本当に、プロセスがハッシュ衝突の観点から「セキュリティ」を低下させるかどうか疑問に思っています。
43 hashing 

10
初期段階でのプロトタイピングとクリーンコード
私は毎日の仕事になってしまう可能性のあるいくつかの個人的なプロジェクトに取り組みます。それは私に考えさせられました。 ただプロトタイプ-簡単に拡張できるように最適化とリファクタリングに膨大な時間を費やす可能性のある、動作する基本的なコードを書くだけです。 クリーンで最適化され、文書化されたコードを最初から記述します。しばらくしてから費用対効果が低下すると、削除されます。 更新: YAGNIとsunpechおよびM.Sameerの回答を組み合わせることは、私にとって完全に理にかなっています:)皆さん、助けてくれてありがとう。

8
単一の構成オブジェクトは悪い考えですか?
ほとんどのアプリケーションでは、シングルトンまたは静的な「構成」オブジェクトを使用して、ディスクからさまざまな設定を読み取ります。ほぼすべてのクラスがさまざまな目的で使用します。基本的には、名前/値のペアの単なるハッシュテーブルです。それは読み取り専用なので、私はそんなにグローバルな状態を持っているという事実にあまり関心がありません。しかし、ユニットテストを始めた今、問題になり始めています。 1つの問題は、通常、実行するのと同じ構成でテストしたくないということです。これにはいくつかの解決策があります。 configオブジェクトに、テストにのみ使用されるセッターを与えると、異なる設定を渡すことができます。 単一の構成オブジェクトの使用を続けますが、シングルトンから、必要なすべての場所に渡すインスタンスに変更します。その後、アプリケーションで1回、テストで1回、さまざまな設定で構築できます。 しかし、どちらにしても、2番目の問題が残っています。ほとんどすべてのクラスがconfigオブジェクトを使用できます。そのため、テストでは、テストするクラスの構成を設定する必要がありますが、その依存関係もすべて設定する必要があります。これにより、テストコードが見苦しくなります。 この種の設定オブジェクトは悪い考えだという結論に達し始めています。どう思いますか?いくつかの選択肢は何ですか?そして、どこでも設定を使用するアプリケーションのリファクタリングをどのように開始しますか?

15
マネージャーとプログラマを同時に兼ねることはできますか?[閉まっている]
自分がプログラミング労働力の一部である間に他のプログラマーを管理する。 少なくとも私が働いていた会社では、これは非常に一般的なスキームです。 両方を同時に行う場合、優秀なプログラマーまたは優秀なマネージャーになれますか? 私は非常に異なるスキル、環境、集中力、組織などを必要とする2つの非常に異なる役割を果たさなければならない個人の有効性に疑問を抱いています。 更新:私の質問には、チーム管理ではなく、会社の管理(私の場合)が含まれます。しかし、私はもちろん両方に興味があります。

7
固い原則とヤグニ
ソリッド原則はいつYAGNIになりますか? プログラマとして、複雑さ、保守性、構築時間などの間で常にトレードオフを行います。とりわけ、選択を行うための最も賢明なガイドラインの2つは、SOLID原則とYAGNIです。必要ない場合; ビルドせず、クリーンに保ちます。 たとえば、SOLIDのダイムキャストシリーズを見ると、かなり単純なプログラムとして始まり、非常に複雑なプログラムになります(最後にはい複雑さも見る人の目にあります)。私は不思議に思う:いつ固い原則はあなたが必要としない何かに変わるのか?すべての堅固な原則は、後の段階で使用して変更を加えることを可能にする作業方法です。しかし、解決すべき問題が非常に単純で、使い捨てのアプリケーションである場合はどうでしょうか?または、SOLID原則は常に適用されるものですか? コメントで尋ねられたように: 固い原則 ヤグニ

10
LINQおよびLambda Expressionsを使用すると、コードが読みにくくなりますか?[閉まっている]
私はLinqの同僚と議論しています。ここにコピーします: 同僚:ここで正直に話しましょう。Linq構文はダメです。わかりにくく直感的ではありません。 私:ああ、T-SQLよりも混乱しますか? 同僚:ええ、はい。 私:それは同じ基本的なパーツ、select、where、fromを持っています 同僚:私にとって、Linqはリレーショナル+ OOのろくでなしです。同僚:誤解しないでください。信じられないほど強力ですが、SQLを再利用してオブジェクトコレクションを使用しました。 私は、Linq + Lamdaを使用することは非常に強力であり(彼は同意します)、またコードを読みやすくします(彼はその点で同意しません)と思います。 pickFiles = from f in pickFolder.GetFiles("*.txt") where ValidAuditFileName.IsMatch(f.Name) select f; または var existing = from s in ActiveRecordLinq.AsQueryable<ScannedEntity>() where s.FileName == f.FullName && s.DocumentType != "Unknown" select s; または(VBコードはこちら) Dim notVerified = From image In images.AsParallel Group Join verifyFile In …

10
「プレーンな古いデータ」クラスを使用する理由はありますか?
レガシーコードでは、データのラッパーにすぎないクラスが時々見られます。何かのようなもの: class Bottle { int height; int diameter; Cap capType; getters/setters, maybe a constructor } オブジェクト指向についての私の理解は、クラスはデータの構造であり、そのデータを操作する方法だということです。これは、このタイプのオブジェクトを除外するようです。私にとって、それらはstructsオブジェクト指向の目的に勝るものではありません。コードの匂いかもしれませんが、必ずしも悪いとは思いません。 そのようなオブジェクトが必要になる場合はありますか?これが頻繁に使用される場合、デザインが疑わしいですか?

20
趣味のプロジェクトにどのようにモチベーションを保ちますか?[閉まっている]
趣味で学生として真剣にプログラミングを始め、約4年前にインターンを始め、学習演習として常に小さなプロジェクトをやっています。学校はもう終わりました。私はソフトウェア開発者として仕事で日々を過ごしています。私はまだ仕事中にさらされていないコンピューターサイエンスの分野について学ぶために、側でプロジェクトを行いたいと思っていますが、IDEで8時間主演した後、ベジになりがたいことに気づきました。私が最近数時間何かに取り組むために意気込みを起こしたときはいつでも、それは道端に残されています。 コーディングのほとんどを費やしているときに、サイドプロジェクトにこだわるというアドバイスはありますか?

19
プログラマ以外の人とどうやってクラフトを共有しますか?
ライブショーをできないミュージシャンのように感じることもあります。プログラミングは非常にクールなスキルであり、非常に広い世界ですが、その多くは「カメラから離れて」発生します。頭の中、オフィス、観客から離れています。 もちろん、他のプログラマーとプログラミングについて話し合うことができ、ピアプログラミングがあり、人々に見せることができるものを作成することができますが、非プログラマーにそれが何であるか、またはどうだったかを説明することになると仕事でのあなたの一日は、ちょっと難しいです。 あなたの人生で非プログラマにどうやってあなたが何をしているのかを理解させるにはどうすればいいですか? 注:これは、プログラマ以外の人に開発プロセスを理解してもらうことの繰り返しではありません。なぜなら、その質問はクライアントの期待を管理することに関するものだからです。

1
MITライセンスの著者名の変更[終了]
数年前、私はMITライセンスの下でいくつかのソフトウェアを書いてリリースしました。 最近、フォークの1つ(またはいくつか?)がライセンスの先頭にある主要な著作権表示を変更していることに気付きました。 Copyright (c) 2014 <my name> MIT License Permission is hereby granted, free of charge, to any person obtaining a copy of this software... に Copyright (c) 2019 <new author> MIT License Permission is hereby granted, free of charge, to any person obtaining a copy of this software... それは単なる小さなツールですが、ほとんどが私の仕事だったものから私の名前が剥奪されているのは少し気分が悪いです。 …

7
同じ入力が常に同じ出力を返すだけでなく、副作用がある関数を何と呼びますか?
次のような通常の純粋な関数があるとします function add(a, b) { return a + b } そして、副作用があるように変更します function add(a, b) { writeToDatabase(Math.random()) return a + b; } 私の知る限り、純粋な関数とは見なされていません。なぜなら、人々は純粋な関数を「副作用のない関数」と呼ぶことがよくあるからです。ただし、同じ入力に対して同じ出力を返すという点では、純粋な関数のように動作します。 このタイプの関数には別の名前がありますか、名前が付けられていないのですか、それとも実際には純粋であり、純度の定義について間違っていますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.